numpy相关知识
- 数组的创建
import numpy as np #导入numpy包
vector = np.array([5,10,15,20]) #创建一维数组
#创建3*3数组
matrix = np.array([[5,10,15],[20,25,30],[35,35,40]])
print(vector)
print(matrix)
#输出结果
vector:[ 5 10 15 20],
matrix:[[ 5 10 15]
[20 25 30]
[35 35 40]]
numpy 中的array是用来创建矩阵(向量)的方法
- 数组的处理
data = matrix[1,1] #选取vector数组的第2行,第2列
#此处的操作类似其他语言中的二维数组元素的选取,matrix[1][1]
print(data)
data:25
- 数组的切片处理
a = vectory[0:2] #选取第一个到第二个之间的数据
print(a)
a:[ 5 10]
更高级的用法
b = matrix[:,0:2] #选取全部行的第0列到第2列之间的数据
c = matrix[0:1,0:2] #选取第0行到第2行的第0列到第2列之间的数据
print(b)
print(c)
b:[[ 5 10]
[20 25]
[35 35]]
c:[[ 5 10]
[20 25]]
- 数组比较的处理
d = (vectory == 10) #将数组里面的元素挨个与10比较,获得一个数组
print(d)
d:[False True False False]
- 矩阵的初始化
#从0到15转换为一个3*5的矩阵
a = np.arange(15).reshape(3,5)
#从5到30,步长为5
b = np.arange(5,30,5)
print(a)
print(b)
a:[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
b:[ 5 10 15 20 25]
#生成一个3*4的全为0的矩阵,元素格式是float32
zero = np.zeros((3,4),dtype=np.float32)
#生成一个2*3*4的全是1的矩阵
one = np.ones((2*3*4))
#随机生成的2*3的矩阵
ran = np.random.random((2,3))
print(zero)
print(one)
print(ran)
zero:array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]], dtype=float32)
one:array([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]])
ran:array([[0.34817089, 0.61185558, 0.12936576],
[0.04225644, 0.40562247, 0.5929412 ]])
- 矩阵的维度
w = zero.ndim
print(w)
w:2
- 內积
aa = np.array([[1,1],[0,1]])
bb = np.array([[2,0],[3,4]])
#内积
cc = aa.dot(bb)
dd = np.dot(aa,bb)
print(cc)
print(dd)
cc:[[5 4]
[3 4]]
dd:[[5 4]
[3 4]]
- 矩阵转向量,矩阵改变形式
a2 = np.floor(10*np.random.random((3,4)))
#矩阵转向量
b2 = a2.ravel()
#改变矩阵的形式
a2.shape = (6,2)
print(a2)
print(b2)
a2:[[0. 7. 8. 0.]
[5. 9. 8. 9.]
[4. 6. 5. 9.]]
b2:[0. 7. 8. 0. 5. 9. 8. 9. 4. 6. 5. 9.]
- 数组的拼接操作
a3 = np.floor(10*np.random.random((2,2)))
a4 = np.floor(10*np.random.random((2,2)))
print(a3)
print(a4)
#数组的拼接操作
#水平拼接
print(np.hstack((a3,a4)))
#垂直操作
print(np.vstack((a3,a4)))
a3:[[0. 0.]
[2. 2.]]
a4:[[4. 9.]
[3. 5.]]
水平拼接:[[0. 0. 4. 9.]
[2. 2. 3. 5.]]
垂直拼接:[[0. 0.]
[2. 2.]
[4. 9.]
[3. 5.]]
- 浅拷贝
#浅拷贝
a = np.arange(12)
b = a
b.shape = (3,4)
print(a.shape)
print(id(a))
print(id(b))
a.shape: (3,4)
id(a):139664825349024
id(b):139664825349024
- 介于深拷贝和浅拷贝之间的数据共享
#创建一个数组,数据部分共享
c = a.view()
print(c is a)
c.shape = (2,6)
c[1,1] = 1234
print(a)
print(c)
c is a : False
a:[[ 0 1 2 3]
[ 4 5 6 1234]
[ 8 9 10 11]]
c:[[ 0 1 2 3 4 5]
[ 6 1234 8 9 10 11]]
- 深拷贝
#深copy
d = a.copy()
print(d is a)
d[1,1] = 12345
print(d)
print(a)
d is a: False
d:[[ 0 1 2 3]
[ 4 12345 6 1234]
[ 8 9 10 11]]
a:[[ 0 1 2 3]
[ 4 5 6 1234]
[ 8 9 10 11]]
- 矩阵排序的相关知识
data = np.sin(np.arange(20)).reshape(5,4)
print(data)
#按列取最大位置索引
ind = data.argmax(axis=0) # axis = 0表示按列排序,1表示按行排序
print(ind)
data_max = data[ind,range(data.shape[1])]
#行数
print(data.shape[0])
#列数
print(data.shape[1])
print(data_max)
data:[[ 0. 0.84147098 0.90929743 0.14112001]
[-0.7568025 -0.95892427 -0.2794155 0.6569866 ]
[ 0.98935825 0.41211849 -0.54402111 -0.99999021]
[-0.53657292 0.42016704 0.99060736 0.65028784]
[-0.28790332 -0.96139749 -0.75098725 0.14987721]]
ind:[2 0 3 1] #第一个2是第一列的最大值0.98935825的位置2
data.shape[0]:5 #表示行数
data.shape[1]:4 #表示列数
data_max:[0.98935825 0.84147098 0.99060736 0.6569866 ] #由数组中最大的几个数组成
data_a = np.array([[4,3,5],[1,2,1]])
print(data_a)
#对每一行进行排序
data_sort = np.sort(data_a,axis=1)
print(data_sort)
print(data_a)
#对数组排序后的位置进行返回
data_aa = np.array([4,2,1,3])
data_bb = np.argsort(data_aa)
#返回排序后的index
print(data_bb)
print(data_aa[data_bb])
data_a:[[4 3 5]
[1 2 1]]
data_sort:[[3 4 5]
[1 1 2]]
data_aa:[4 2 1 3]
data_bb:[2 1 3 0] #第一个2表示排名第一的应该是index为2的1
data_aa[data_bb]:[1 2 3 4]
#以data_aaa为单位,生成(3,5)的矩阵
data_aaa = np.arange(0,40,10)
data_bbb = np.tile(data_aaa,(3,5))
print(data_bbb)
data_bbb:
[[ 0 10 20 30 0 10 20 30 0 10 20 30 0 10 20 30 0 10 20 30]
[ 0 10 20 30 0 10 20 30 0 10 20 30 0 10 20 30 0 10 20 30]
[ 0 10 20 30 0 10 20 30 0 10 20 30 0 10 20 30 0 10 20 30]]
- 矩阵的最小、大值
#最小值和最大值的求取
z = 10*np.random.random((3,3))
zmin,zmax = z.min(),z.max()
print(zmin)
print(zmax)
zmin:1.1197570239299504
zmax:9.79119437876471
- 矩阵归一化
#矩阵归一化
z = 10*np.random.random((3,3))
print(z)
zmin,zmax = z.min(),z.max()
#归一化操作
z = (z-zmin)/(zmax-zmin)
print(z)
z:
[[8.09518796 4.6561416 1.49280322]
[7.71101823 0.37948767 4.09183158]
[7.49326444 1.88239213 3.17810515]]
z:#归一化后的矩阵
[[1. 0.55427943 0.14429222]
[0.95020935 0. 0.48114154]
[0.92198718 0.19478523 0.36271724]]