Cris 的 Python 資料分析筆記 04:NumPy 矩陣的複製,排序,拓展
阿新 • • 發佈:2018-11-19
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]