文章目录
一、属性及其定义
import numpy as np #载入模块
a = np.array([[1,2,3],[2,3,4]],dtype = np.float64) #用列表创建一个矩阵 (两行三列)
a1 = np.zeros((3,4)) #创建三行四列的零矩阵
a1 = np.ones((3,4)) #创建三行四列的1矩阵
a1 = np.empty((3,4)) #创建三行四列的接近零的矩阵
print(a) #会输出矩阵形式的a
print(a.ndim) #几行 2
print(a.shape) #元组形式的 行数,列数 (2, 3)
print(a.size) #一共多少元素 6
a1 = np.arange(10,20,2) #元素范围是10到20左闭右开,步长为2
print(a1) #[10 12 14 16 18]
a2 = np.arange(12).reshape((3,4)) #一共是12个元素(0到11),然后再变为3行4列的矩阵
print(a2) #输出形式为矩阵形式
a3 = np.linspace(1,10,5) #表示从1到10(左闭右闭),分成5段(从1开始每个都加(10-1)/(5-1),也可以加上.reshape,进一步使其变为几行几列的矩阵。
print(a3) #[ 1. 3.25 5.5 7.75 10. ]
生成随机三行四列矩阵:a1 = np.random.random((3,4))
生成随机符合正态分布的三行四列矩阵:a1 = np.random.randn(3,4)
二、运算
1. 元素的运算
import numpy as np #载入模块
a = np.array([[1,2,3],[4,3,2]])
b = np.arange(6).reshape((2,3))
print(b<3) #结果为布尔型的矩阵
c1 = a+b #表示两个矩阵可以加减乘除,也可以开方,注意乘法时不是矩阵的乘法
b = np.arange(6).reshape((3,2))
c2 = np.dot(a,b) #矩阵乘法或者形式为 c1 = a.dot(b)
d = np.sin(a) #cos,tan也一样,对每个元素取sin值
print(np.sum(a)) #矩阵中 所有元素 求和
print(np.min(a)) #求矩阵 所有元素 中的最小值
print(np.max(a)) #求矩阵 所有元素 中的最大值
#当 axis = 0 时为求每列的
print(np.sum(a,axis=1)) #每行元素求和(输出形式为序列)
print(np.min(a,axis=1)) #求矩阵每行的最小值(输出形式为序列)
print(np.max(a,axis=1)) #求矩阵每行的最大值(输出形式为序列)
print(np.mean(a)) #求所有元素的平均值(后面加上axis=0或=1区分列行(输出形式为序列))
print(np.median(a)) #求所有元素的中位数(后面加上axis=0或=1区分列行(输出形式为序列))
print(np.sort(a)) #输出升序排序之后的矩阵
print(np.transpose(a)) #矩阵的转置(输出形式为矩阵)或者 a.T
print(np.clip(a,5,9)) #矩阵中所有小于5的数都变为5,所有大于9的数都变为9,[5,9]之间的数不变
print(np.cumsum(a) ) #繁殖数(个数相同,输出形式为序列 )[ 1 3 6 10 13 15]
print(np.diff(a)) #每行后列元素减前列元素(结果为矩阵会比a少一列)
print(np.nonzero(a)) # 输出非0元素的索引(形式奇异)
2. 有关索引的运算
- 单个输出
import numpy as np #载入模块
a = np.arange(3,15).reshape((3,4))
print(np.argmin(a)) #输出矩阵所有元素中最小值的索引 0
print(np.argmax(a)) #矩阵所有元素中最大值的索引 11
print(a[2,1]) #第三行第二列 12
print(a[:,1]) #第二列 [ 4 8 12]
print(a[1,:]) #第二行 [ 7 8 9 10]
print(a[1,1:3]) #第二行,第2列和第3列的值(输出形式为序列) [8 9]
- 循环输出
import numpy as np #载入模块
a = np.arange(3,15).reshape((3,4))
for i in a:
print(i) #一行一行输出(序列形式),以换行隔开
for i in a.T: #(or in np.transpose(a))
print(i) #一列一列输出(序列形式),以换行隔开
for i in a.flat:
print(i) #输出每个元素
print(a.flatten()) #可将矩阵a变为序列输出 [ 3 4 5 6 7 8 9 10 11 12 13 14]
三、合并(1表示行->左右延申)(0表示列->上下延申)
初始化
a = np.array([1,2,3])
b = np.array([10,20,30])
表示输出时变为行矩阵:print(a[np.newaxis,:])
#使得序列变为行矩阵, shape从(3,)变为(1,3)
表示输出时变为列矩阵:print(a[:,np.newaxis]) #使得序列变为列矩阵,shape从(3,)变为(3,1)
方法一
初始化:a = np.array([1,2,3])
生成序列 [1 2 3]
初始化:b = np.array([10,20,30])
生成序列 [10 20 30]
上下合并: print(np.vstack((a,b)))
左右合并: print(np.hstack((a,b)))
多个矩阵上下合并 : print(np.vstack((a,b,b,a)))
多个矩阵左右合并 : print(np.hstack((a,b,b,a)))
方法二
初始化时变为行矩阵:a = np.array([1,2,3])[np.newaxis,:]
生成矩阵 [ [1 2 3] ]
或者 a = np.array([1,2,3]).reshape(1,3)
初始化时变为列矩阵:a = np.array([1,2,3])[:,np.newaxis]
或者 a = np.array([1,2,3]).reshape(3,1)
#必须要求a,b初始化时为矩阵(不能为序列)。
print(np.concatenate((a,b,b,a),axis=0)) #表示上下合并
print(np.concatenate((a,b,b,a),axis=1)) #表示左右合并
四、分割(1表示行->行不变,列分割)
1.等量分割:
初始化
a = np.arange(12).reshape((3,4)) #初始化三行四列的矩阵
print(np.split(a,2,axis=1))
表示对矩阵a实行列分割,分成2块
print(np.split(a,3,axis=0))
表示对矩阵a实行行分割,分成3块
或者更为简化的分割函数如下:
print(np.hsplit(a,2))
表示左右分开,分成两块,输出结果同上(列分割)
print(np.vsplit(a,3))
表示上下分开,分成三块,输出结果同上(行分割)
2.不等量分割
print(np.array_split(a,3,axis=1))
结果如下:(列分割成了2,1,1的形式,分割的形式类似二分思想)
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2],
[ 6],
[10]]), array([[ 3],
[ 7],
[11]])]
五、赋值(深浅拷贝问题)
在numpy里,普通赋值(如b = a),改变一个会影响另外一个,它们占用相同内存空间
b = a.copy()或者b = np.copy(a),会开辟新的内存空间。