一、Numpy的切片
1、格式
數組[起始:終止:步長]
2、缺省值
缺省起始:步長爲正,首;步長爲負,尾
缺省終止:步長爲正,尾後;步長爲負,首前
缺省步長:1
3、端部切片
靠近端部的一個或幾個連續的維度使用缺省切片,可以用“…”表示
- print(a[3:6]): 起始包括終止不包括:有指定起始值,則不包括起始值,即4到6包括6
- print(a[-4:-7:-1]) :步長爲-1,起始是倒數第3個即7(不包括),終止是倒數第6個即4(包括)
4、練習代碼
import numpy as np
# 一維數組的切片取值
# a = np.arange(1,10) # 表示1,2,3,4,5,6,7,8,9
# print(a[:3]) # 與索引不同,缺省起始爲首(第一個),即1;這裏表示1到3包括3,步長爲1
# print(a[3:6]) # 起始包括終止不包括:有指定起始值,則不包括起始值,即4到6包括6
# print(a[6:]) # 缺省終止爲尾後(最後一個),即9,這裏表示從7到9
# print(a[::-1]) # 缺省起始爲首9,缺省終止爲尾後1,即所有的數都包括在內,步長爲負,所以是逆序
# print(a[:-4:-1]) # 步長爲-1,缺省起始是尾,即9;-4是倒數第3個,到7
# print(a[-4:-7:-1]) # 步長爲-1,起始是倒數第3個即7(不包括),終止是倒數第6個即4(包括)
# print(a[-7::-1]) # 步長爲-1,起始是倒數第6個即4(不包括),終止是缺省終止1(倒序最後一個)
# print(a[...]) # 端部切片,全部取
# print(a[::3]) # 全取,步長3
# print(a[1::3]) # 從1開始取到結束,步長3
# print(a[:9:3]) # 從首取到9(包括),步長3
# 二維數組的切片取值
b = np.arange(1, 25).reshape(2, 3, 4) # 將一維的數組變爲2*3*4的三維數組
# print(b)
'''
[[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[13 14 15 16]
[17 18 19 20]
[21 22 23 24]]]
'''
print(b[:, 0, 0]) # ":"在頁位上,表示每一頁;後面的0表示第0行第0列
print(b[0, :, :]) # 第0頁上是所有行所有列,即整個第0頁
print(b[0, 1, ::2]) # 第0頁的第1行,用步長爲2從整行取
print(b[:, :, 1]) # 每一頁的每一行的第一列,也可表示爲print(b[..., 1])
print(b[:, 1]) # 每一頁的第一行,沒有表示列的
print(b[-1, 1:, 2:]) # 最後一頁,第1行(起始不包括)到最後一行,第2列(起始不包括)到最後一列
二、數組變維
1、視圖變維: 針對一個數組對象獲取其不同維度的視圖數組
reshape(新維度)——>數組的新維度視圖
ravel()——>數組的一維視圖
2、複製變維: 針對一個數組對象獲取其不同維度的副本
flatten()——>數組的一維副本
實際上在內部,改變維度其實是重新創建了一個對象,指向原來那個對象包含數據的內存地址
3、就地變維: 直接改變某個數組本身的維度
數組.shape = 新維度
數組.resize(新維度)
4、視圖轉置: 行列互換,行數變成列數,列數變成行數
數組.transpose()——>數組的轉置視圖
數組.T:轉置視圖屬性來轉置
5、練習代碼
import numpy as np
a = np.arange(1, 9)
b = a.reshape(2, 4) # 創建了一個a數組的視圖b
# print(b)
c = b.reshape(2, 2, 2) # 3頁3行3列
# print(c)
d = c.ravel() # 回到原來的數組,一維數組
# flatten創建副本,副本與原來的數組是獨立的
e = b.flatten()
# print(d)
# print(e)
a += 10 # 將a中的元素都+10,則每個reshape來的數組都會變化,而flatten得到的副本不會變
# print(a, b, c, d,sep='\n')
# print(e)
# reshape()也可以創建副本,需要用copy()
f = b.reshape(2, 2, 2).copy()
b += 10
# print(b)
# print(f)
# 就地變維:直接改變某個數組本身的維度
a.shape = (2, 2, 2)
# print(a)
a.resize(2, 4)
# print(a)
# 視圖轉置
g = a.T # 原本是2*4,現在是4*2
# 或者使用g = a.transpose()
print(g)
三、組合與拆分
1、vstack與vsplit
stack就是棧(堆疊)的意思,split就是分割的意思。
1)垂直組合:numpy.vstack((上,下))
2)垂直拆分:numpy.vsplit(數組,份數)——>子數組集合
3)水平組合:numpy.hstack((左,右))
4)水平拆分:numpy.hsplit(數組,份數)——>子數組集合
5)深度組合:numpy.dstack((前,後))
6)深度拆分:numpy.dsplit(數組,份數)——>子數組集合
7)行組合:numpy.row_stack((上,下))
8)列組合:numpy.column_stack((左,右))
2、練習代碼
import numpy as np
# 垂直組合vstack
a = np.arange(11, 20).reshape(3, 3)
b = np.arange(21, 30).reshape(3, 3)
# 將a與b組成一個棧,a在上,b在下
c = np.vstack((a, b))
# print(c)
# 垂直拆分vsplit
a, b = np.vsplit(c, 2) # 將c拆成2份,結果放在a,b中
# print(a)
# print(b)
# 水平組合,水平拆分
c = np.hstack((a, b))
# print(c)
a, b = np.hsplit(c, 2) # 在水平方向將c拆成2份
# print(a, b, sep='\n')
# 深度組合,深度拆分
c = np.dstack((a, b))
# print(c)
'''深度組合的結果
[[[11 21]
[12 22]
[13 23]]
[[14 24]
[15 25]
[16 26]]
[[17 27]
[18 28]
[19 29]]]
'''
a, b = np.dsplit(c, 2)
# 依然是三維數組,不會回到原來的a,b
# print(a, b, sep='\n')
# 轉置兩次纔可以回到原來的a,b
# print(a.T[0].T, b.T[0].T, sep='\n')
# 行列組合
a = a.ravel() # 回到原來的一維數組
b = b.ravel()
c = np.row_stack((a, b)) # 拼接成兩個一維數組,呈2行
# print(c)
c = np.column_stack((a, b)) # 呈2列
print(c)