版权声明:转载请注明出处~ 摸摸博主狗头 https://blog.csdn.net/cris_zz/article/details/84200481
04. 矩阵的复制,排序,拓展
1. NumPy 的引用问题
import numpy as np
# 同一个对象的不同引用将会互相影响(实质改变的都是同一个对象)
a = np.arange(12)
b = a
print(a is b)
print(id(a))
print(id(b))
b.shape = 2,6
print(a)
True
2690130685744
2690130685744
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]]
2. 浅复制
# view 函数用于浅复制,虽然 a 和 c 的内存地址不一致,但是指向的数据都是同一份,c 修改了矩阵数据的值,同样会影响 a
# 以下代码执行两次的结果 a 矩阵的数据不一致!
print(a)
print('--------')
c = a.view()
print(c is a)
print(id(a))
print(id(c))
c.shape = 3,4
print(c)
c[0,0] = 1234
print(c)
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]]
--------
False
2690130685744
2690130727280
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[1234 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
3 深复制
# d 任意改变不会对 a 产生任何影响
d = a.copy()
print(d is a)
print(d)
d[1,1] = 100
print(d)
print(a)
False
[[1234 1 2 3 4 5]
[ 6 7 8 9 10 11]]
[[1234 1 2 3 4 5]
[ 6 100 8 9 10 11]]
[[1234 1 2 3 4 5]
[ 6 7 8 9 10 11]]
6
4. 索引求最值
a = np.sin(np.arange(12)).reshape(3,-1)
print(a)
# shape 属性是一个元祖,第一个元素表示该矩阵有多少行,第二个元素表示列
print(a.shape)
# 按照列求每列的最值所在的索引
index = a.argmax(axis=0)
print(index)
'''
为了取出每一列的最值,这里有点绕~~~
首先 index 表示每列值的最大值的索引(索引方向从上往下),然后将这个索引列表作为二维矩阵的行参数(最大值的索引其实
就是表示该最值在该列的第几行位置),然后列参数就需要使用 range(a.shape(1)),a.shape(1)就是列的数量(这里是4)
取值流程:
通过 range(列数)的方式来每次循环一列,取出对应索引列表里的值,比如索引列表的第一个值为 2,那么 range 循环来到 0
列,取出 0 列的索引为 2 的值放入结果列表中;然后索引列表的第二个值为 0,range 循环来到第 1 列,则取出第一列索引
为 0 的值放入到结果列表中;以此类推知道 range 函数循环完毕
注意:如果按照惯性思维,这里的 range 函数应该替换为 :,表示所有列,此时就会针对每一列执行索引列表的所有索引位置
取值操作,取出来的值如下结果展示
'''
maxs = a[index,range(a.shape[1])]
print(maxs)
print('=============================')
max2 = a[index, :]
print(max2)
[[ 0. 0.84147098 0.90929743 0.14112001]
[-0.7568025 -0.95892427 -0.2794155 0.6569866 ]
[ 0.98935825 0.41211849 -0.54402111 -0.99999021]]
(3, 4)
[2 0 0 1]
[0.98935825 0.84147098 0.90929743 0.6569866 ]
=============================
[[ 0.98935825 0.41211849 -0.54402111 -0.99999021]
[ 0. 0.84147098 0.90929743 0.14112001]
[ 0. 0.84147098 0.90929743 0.14112001]
[-0.7568025 -0.95892427 -0.2794155 0.6569866 ]]
5. title 扩展
data = np.arange(0,40,10)
print(data)
# tile 函数的作用就是将当前的矩阵,作为一个列单元,按照传入的 shape 元祖参数拓展,拓展结果如下图
data = np.tile(data,(4,3))
print(data)
[ 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]]
6. sort 排序
data = np.array([[2,5,1,0],[9,2,0,8]])
# 按照行维度进行排序(不会对原矩阵造成影响)
print(np.sort(data, axis=1))
print(data)
print('----------')
# 还可以按照行对原矩阵进行排序
data.sort(axis=1)
print(data)
# argsort() 函数可以对矩阵排序得到排序后的元素在原矩阵的索引(默认按行)
data = np.array([5,3,16,9])
print(data)
index = np.argsort(data)
print('---------')
print(index)
# 将排序后的索引通过矩阵切片得到排序好的新矩阵
print(data[index])
[[0 1 2 5]
[0 2 8 9]]
[[2 5 1 0]
[9 2 0 8]]
----------
[[0 1 2 5]
[0 2 8 9]]
[ 5 3 16 9]
---------
[1 0 3 2]
[ 3 5 9 16]