1. 程式人生 > >Cris 的 Python 資料分析筆記 04:NumPy 矩陣的複製,排序,拓展

Cris 的 Python 資料分析筆記 04:NumPy 矩陣的複製,排序,拓展

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]