python numpy常用操作
Numpy基本操作
# 导入numpy
import numpy as np
# 生成numpy数组
x = np.array([1.0, 2.0, 3.0])
print(x) # [1. 2. 3.]
print(type(x)) # <class 'numpy.ndarray'>
# Numpy的算术运算
x = np.array([1.0, 2.0, 3.0])
y = np.array([2.0, 4.0, 6.0])
print(x+y) #[3. 6. 9.]
print(x-y) #[-1. -2. -3.]
print(x*y) # [ 2. 8. 18.]
print(x/y) #[0.5 0.5 0.5]
# Numpy的多维数组
A = np.array([[1, 2], [3, 4]])
print(A)
#[[1 2]
# [3 4]]
# 矩阵A的形状可以通过shape查看
print(A.shape)#(2, 2)
# 矩阵A的元素类型可以通过dtype查看
print(A.dtype)#int32
# 矩阵的算数运算:
B = np.array([[3, 0], [0, 6]])
print(A+B)
print(A*B)
print(A*10)
'''
[[ 4 2][ 3 10]][[ 3 0][ 0 24]][[10 20][30 40]]
'''
# 广播:形状不同的数组之间也可以进行运算
A = np.array([[1, 2], [3, 4]])
B = np.array([10, 20])
print(A*B)
'''
[[10 40][30 80]]
'''
# 访问元素
x = np.array([[51, 55], [14, 19], [0, 4]])
print(x)
'''
[[51 55][14 19][ 0 4]]
'''# 访问第0行
print(x[0])#[51 55]
# 访问(0,1)的元素
print(x[0][1])#55
# 使用数组访问各个元素
# 将x转换为一维数组
x = x.flatten()
print(x)#[51 55 14 19 0 4]
# 获取索引为0,2,4的元素
print(x[np.array([0, 2, 4])])#[51 14 0]# 取出大于15的元素
print(x[x > 15])#[51 55 19]
Numpy 多维数组、矩阵相乘、矩阵乘以向量
第一个例子:
import numpy as npif __name__ == '__main__':A=np.array([[1,2],[3,4]])B=np.array([[5,6],[7,8]])print(B)print(np.ndim(B)) # 表示B是二维数组,也就是说有两列print(B.shape) # 输出B的形状,几行几列C=np.dot(A,B) # 矩阵相乘,需要满足矩阵乘法原则print(C)
输出:
[[5 6][7 8]]
2
(2, 2)
[[19 22][43 50]]
第二个例子:
import numpy as npif __name__ == '__main__':A=np.array([1,2]) # 2*1B=np.array([[1,3,5],[2,4,6]]) #2*3print(A)print(np.ndim(A))print(A.shape)print(B)print(np.ndim(B))print(B.shape)C=np.dot(A,B) #1*3print(C)print(np.ndim(C))print(C.shape)
结果:
[1 2]
1
(2,)
[[1 3 5][2 4 6]]
2
(2, 3)
[ 5 11 17]
1
(3,)
第三个例子:
import numpy as npif __name__ == '__main__':A=np.array([[1,2],[3,4],[5,6]]) # 3*2B=np.array([[7],[8]]) #2*1print(A)print(np.ndim(A))print(A.shape)print(B)print(np.ndim(B))print(B.shape)C=np.dot(A,B) #3*1print(C)print(np.ndim(C))print(C.shape)
结果:
[[1 2][3 4][5 6]]
2
(3, 2)
[[7][8]]
2
(2, 1)
[[23][53][83]]
2
(3, 1)
第四个例子:
import numpy as npif __name__ == '__main__':A=np.array([[1,2],[3,4],[5,6]]) # 3*2B=np.array([7,8])# 2*1print(A)print(np.ndim(A))print(A.shape)print(B)print(np.ndim(B))print(B.shape)C=np.dot(A,B) print(C)print(np.ndim(C))print(C.shape)
结果
[[1 2][3 4][5 6]]
2
(3, 2)
[7 8]
1
(2,)
[23 53 83]
1
(3,)
根据这里面2、3、4例子,可以总结出一个简便的理解思路。
一个矩阵乘一个向量,不用管那个向量究竟是行向量还是列向量。也不要管输出的向量是行向量还是列向量。因为我们的目的不是分辨它的形式是如何,而是要得到新向量里面的元素,所以就忽略它的存储形式。事实上,如果你非要弄清楚它的存储形式,那么你将被numpy的语法绕晕,把时间浪费到不重要的地方。
如果矩阵A是三行两列,一维向量B(也就是数组)里面有x个数,
x=矩阵的行的话,那么A乘以B就调用np.dot(B,A)
X=矩阵的列的话,那么A乘以B就调用np.dot(A,B)
用图来理解: