Cris 的 Python 数据分析笔记 04:NumPy 矩阵的复制,排序,拓展

版权声明:转载请注明出处~ 摸摸博主狗头 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]

猜你喜欢

转载自blog.csdn.net/cris_zz/article/details/84200481