Python之數據分析(Numpy的數組切片、數組變維、組合與拆分)

一、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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章