1、numpy的3中复制方法
第一种方法:
a = np.arange(12)
b = a
print(b is a)
#运行结果:
True
首先,我们获得1个变量a,然后将a赋值给b,然后进行布尔值判断,发现b is a返回True。
b.shape = (3, 4)
print(a.shape)
print(id(a))
print(id(b))
#运行结果:
(3, 4)
47700192
47700192
然后,我们对b使用shape方法将其变为一个3行4列的矩阵,同时打印a的shape发现,也变成了3行4列。
最后,我们采用id()方法调取a和b的内存位置,发现完全相同,说明a和b指向同一个内存地址。
第二种方法:
a = np.arange(12)
c = a.view()
print(c is a)
#运行结果:
False
然后,我们对c使用shape方法进行改变,然后观察a的shape是否变化:
c.shape = (2, 6)
print(a.shape)
#运行结果:
(12,)
可以发现,a和c的shape结构并不相同。接下来,我们打印一下a和c的内存地址:
print(id(a))
print(id(c))
#运行结果:
50976992
192259440
可以发现,内存地址也不同。
然鹅,见证奇迹的时刻到了……
c[0, 4] = 1234
print(a)
#运行结果:
[ 0 1 2 3 1234 5 6 7 8 9 10 11]
我们把c中的某一个元素进行了改变,然后打印a,发现a对应的元素居然也发生了变化。
原因在于,a和c虽然内存地址不同,但共享数据,共用一套值……(好吧,其实我也没听懂)
第三种方法:
a = np.arange(12)
a.shape = (3, 4)
d = a.copy()
print(d is a)
#运行结果:
False
依然还是获取矩阵a,使用copy()方法赋值给d,然后使用布尔值判断,得到False。
d[0, 0] = 9999
print(d)
print('-----')
print(a)
#运行结果:
[[9999 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
-----
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
OK,我们把d中第一行第一列的元素变成9999,然后分别打印d和a,发现d发生变化,但是a没有变。
copy()方法也是Numpy中最常用的复制方法。
2、一些排序和索引的问题
data = np.sin(np.arange(20).reshape(5, 4))
print(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]]
首先,获取矩阵data。然后我们获取当前矩阵中元组最大值的索引:
ind = data.argmax(axis=0)
print(ind)
#运行结果:
[2 0 3 1]
使用argmax()方法,我们找到了[2 0 3 1],这个是啥?
2、0、3、1四个数字代表的意思是,第1列中第3个数字最大,第2列中第1个数字最大……这样就把索引找到了。axis=0代表按列计算。
索引值找到了,我们就可以利用索引值去找最大的数字了:
data_max = data[ind, range(data.shape[1])]
print(data_max)
#运行结果:
[0.98935825 0.84147098 0.99060736 0.6569866 ]
data_max = data[ind, range(data.shape[1])]需要解释一下:
ind代表第一列最大值在第几行。data.shape == (5, 4), 所以data.shape[1] == 4, range(data.shape[1]) == range(4)
看着写得挺复杂,其实意思就是按照每一列来找。
3、矩阵的扩展
a = np.arange(0, 40, 10)
print(a)
print('--------------')
b = np.tile(a, (3, 5))
print(b)
#运行结果:
[ 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 0 10 20 30]]
使用tile()方法进行扩展,行变为原来的3倍,列变为原来的5倍。
4、对矩阵中的数进行排序
首先,我们获得一个矩阵:
a = np.array([[4, 3, 5], [1, 2, 1]])
print(a)
#运行结果:
[[4 3 5]
[1 2 1]]
然后,我们对这个矩阵通过行进行排序:
b = np.sort(a, axis=1)
print(b)
#运行结果:
[[3 4 5]
[1 1 2]]
可以看到,第一行、第二行均进行了升序排列。
然后,我们使用其他方法进行排序:
a = np.array([4, 3, 1, 2])
j = np.argsort(a)
print(j)
print('---------')
print(a[j])
#运行结果:
[2 3 1 0]
---------
[1 2 3 4]
使用argsort()方法可以将向量又小到大进行排序,并返回其索引值。
之后,我们根据其索引值的顺序,就可以将向量重新进行排序了。