代码改变世界

python numpy

2022-04-05 16:48  jym蒟蒻  阅读(41)  评论(0编辑  收藏  举报

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 np

if __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 np

if __name__ == '__main__':
    A=np.array([1,2]) # 2*1
    B=np.array([[1,3,5],[2,4,6]]) #2*3
    print(A)
    print(np.ndim(A))
    print(A.shape)
    print(B)
    print(np.ndim(B))
    print(B.shape)
    C=np.dot(A,B) #1*3
    print(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 np

if __name__ == '__main__':
    A=np.array([[1,2],[3,4],[5,6]]) # 3*2
    B=np.array([[7],[8]]) #2*1
    print(A)
    print(np.ndim(A))
    print(A.shape)
    print(B)
    print(np.ndim(B))
    print(B.shape)
    C=np.dot(A,B) #3*1
    print(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 np

if __name__ == '__main__':
    A=np.array([[1,2],[3,4],[5,6]]) # 3*2
    B=np.array([7,8])# 2*1
    print(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)

用图来理解:

在这里插入图片描述