Python之Numpy库(6)

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()方法可以将向量又小到大进行排序,并返回其索引值。

之后,我们根据其索引值的顺序,就可以将向量重新进行排序了。

发布了27 篇原创文章 · 获赞 9 · 访问量 997

猜你喜欢

转载自blog.csdn.net/sinat_42574069/article/details/99699332