(作者:陈玓玏)
在求解系数矩阵、画图等过程中,我们总是需要创建很多初始的矩阵,那么今天就干脆来总结一下,numpy中常用的矩阵创建方法及它们的应用场景。
import numpy as np
#arange创建等差数列,可以是整数也可以是小数,np.array(起始值,结束值,步长),注意是左闭右开区间
data = np.arange(0,1,0.1)
#结果:
[ 0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
#array生成多维数组
data = np.array([[0,1],[1,2],[2,3]])
#输出二维数组的切片值,这里分别取第1行第2列和整个数组的第2列
print(data[0,1],data[:,1])
print(data)
#结果:
1 [1 2 3]
[[0 1]
[1 2]
[2 3]]
#copy深复制对象,即不仅复制对象的引用,也为该对象新开辟了一样的内存,改变新对象不改变原对象
data1 = data.copy()
#empty初始化对象为空值,虽然说是空值,但一般输出都会有无限接近0的值出现,因为计算机中的数值0总是会取一些无限接近0的数
data = np.empty((2,4))
#结果:
[[ 6.23042070e-307 4.67296746e-307 1.69121096e-306 1.24610927e-306]
[ 7.56599807e-307 8.90104239e-307 2.22523004e-307 2.44031977e-312]]
#empty_like返回一个和输入矩阵shape相同的array
data = np.empty_like(np.array([[0,1],[1,2],[2,3]]))
#结果:
[[0 0]
[0 0]
[0 0]]
#eye生成对角为1而其余为0的矩阵
data = np.eye(2,3)
#结果:
[[ 1. 0. 0.]
[ 0. 1. 0.]]
#fromfile根据文件中的内容生成矩阵对象
#data = np.fromfile('filepath')
#fromfunction将函数的方式创建数组
#输出x和y可以看到,x是一个第一行全为0,第二行全为1,依此类推的矩阵
#而y是一个第一列全为1,第二类全为2,依此类推的矩阵
#最终得到的data是一个这两个矩阵依公式求得的结果
def f(x,y):
print('x',x,'y',y)
return 10*x+y
data = np.fromfunction(f,(5,4),dtype=int)
#结果:
x
[[0 0 0 0]
[1 1 1 1]
[2 2 2 2]
[3 3 3 3]
[4 4 4 4]]
y
[[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]]
[[ 0 1 2 3]
[10 11 12 13]
[20 21 22 23]
[30 31 32 33]
[40 41 42 43]]
#identity生成单位矩阵,类似eye,不同的是eye输入两个参数,可以生成非方阵,而identity只输入一个参数,只生成方阵
data = np.identity(10)
#结果:
[[ 1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]]
#linspace生成等差数列,与arrange不同的是,它是一个左闭右闭区间,且第三个参数不是步长,而是生成数组的长度
#在画图时使用得多,生成横纵坐标的刻度时很管用
data = np.linspace(1,10,10)
#结果:
[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
#logspace生成等比数列
#base设置底数,前三个参数分别表示指数的开头、指数的结尾、序列的长度
data = np.logspace(1,10,10,base=2)
#结果:
[ 2. 4. 8. 16. 32. 64. 128. 256. 512. 1024.]
#mgrid可以用于生成横纵坐标的刻度,输出值其实是两个矩阵,一个表示y轴的划分,一个表示x轴的划分
#输入参数2:5表示的是纵轴的刻度范围,4:9表示的是横轴的刻度范围,两个小数表示的则是步长
data = np.mgrid[2:5:0.5,4:9:1]
#结果:
[[[ 2. 2. 2. 2. 2. ]
[ 2.5 2.5 2.5 2.5 2.5]
[ 3. 3. 3. 3. 3. ]
[ 3.5 3.5 3.5 3.5 3.5]
[ 4. 4. 4. 4. 4. ]
[ 4.5 4.5 4.5 4.5 4.5]]
[[ 4. 5. 6. 7. 8. ]
[ 4. 5. 6. 7. 8. ]
[ 4. 5. 6. 7. 8. ]
[ 4. 5. 6. 7. 8. ]
[ 4. 5. 6. 7. 8. ]
[ 4. 5. 6. 7. 8. ]]]
#ogrid参数设置和结果与mgrid类似,但mgrid两个输出矩阵是同shape的,而ogrid的输出两个向量,列向量和行向量,
# mgrid的输出结果就是ogrid的结果分别复制扩充为同shape矩阵
data = np.ogrid[2:5:0.1,4:9:0.5]
#结果:
[array([[ 2. ],
[ 2.5],
[ 3. ],
[ 3.5],
[ 4. ],
[ 4.5]]), array([[ 4., 5., 6., 7., 8.]])]
#ones生成全1的矩阵,输入参数为shape
data = np.ones((2,4))
#结果:
[[ 1. 1. 1. 1.]
[ 1. 1. 1. 1.]]
#ones_like生成与输入矩阵同shape的全1矩阵
data = np.ones_like(np.array([[0,1],[1,2],[2,3]]))
#结果:
[[1 1]
[1 1]
[1 1]]
#zeros生成全0的矩阵,输入参数为shape
data = np.zeros((2,4))
#zeros_like生成与输入矩阵同shape的全0矩阵
data = np.zeros_like(np.array([[0,1],[1,2],[2,3]]))
#r合并两个矩阵
data = np.r_[[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]]
print(data)
#结果:
[[1 2 3]
[4 5 6]
[1 2 3]
[4 5 6]]