淺談numpy中函式resize與reshape,ravel與flatten的區別
這兩組函式中區別很是類似,都是一個不改變之前的陣列,一個改變陣列本身
resize和reshape
>>> import numpy as np >>> a = np.arange(20).reshape(4,5) >>> a array([[ 0,1,2,3,4],[ 5,6,7,8,9],[10,11,12,13,14],[15,16,17,18,19]]) >>> a.reshape(2,10) array([[ 0,4,5,14,15,19]]) >>> a array([[ 0,19]]) >>> a.resize(2,10) >>> a array([[ 0,19]])
兩個函式都是改變陣列的形狀,但是resize是在本身上進行操作,reshape返回的是修改之後的引數
ravel和flatten
兩者都可以將陣列轉換為一個維,
flatten(order='C')
引數:{‘C',‘F',‘A',‘K'}
預設情況下‘C'以行為主的順序展開,‘F'(Fortran風格)意味著以列的順序展開,‘A'表示如果a在記憶體中為Fortran連續,則按列展開,否則以行展開,‘K'按照元素在記憶體中出現的順序展平a。
>>> a = np.arange(6).reshape(2,3) >>> a.flatten() array([0,5]) >>> a.ravel() array([0,5]) >>> a.flatten('F') array([0,5]) >>> a.ravel('F') array([0,5]) >>>
>>> x = np.array([[1,2],[3,4]]) >>> a = np.arange(6).reshape(2,3) >>> a.flatten()[...] = 1 >>> a array([[0,5]]) >>> a.ravel()[...] = 1 >>> a array([[1,1],[1,1]]) >>>
flatten不會影響原始矩陣,返回的是一個副本,但是ravel是會修改陣列
補充知識:【Numpy】維度變化reshape、ravel、flatten、transpose、resize、swapaxes
0. 首先,建立一個多維陣列
from numpy import *
a = arange(24)
得到:
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
1.reshape 函式
b = a.reshape(2,4)
print(b)
得到一個 2*3*4 維的陣列:
[[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] [[12 13 14 15] [16 17 18 19] [20 21 22 23]]]
可以想象成2層小洋樓,每層有 3*4 個房間
2.ravel函式 可以將多維陣列展平(也就是變回一維)
c = b.ravel()
print(c)
得到一維陣列
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
3.flatten函式 也是將多維陣列展平,與ravel函式的功能相同,不過flatten函式會請求分配記憶體來儲存結果,而ravel函式只是返回陣列的一個檢視(view)
c = b.flatten()
print(c)
得到一維陣列
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
4.用元組設定維度
直接用一個正整數元組來設定陣列的維度
b.shape = (6,4)
print(b)
這種做法將直接改變所操作的陣列,現在陣列b變成了一個 6*4 的多維陣列
[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15] [16 17 18 19] [20 21 22 23]]
5.transpose函式 將矩陣進行轉置
d = b.transpose()
print(d)
得到 4*6 的多維陣列
[[ 0 4 8 12 16 20] [ 1 5 9 13 17 21] [ 2 6 10 14 18 22] [ 3 7 11 15 19 23]]
6.transpose函式 將矩陣按照設定維度變換順序
b = a.reshape(2,4) c = b.transpose((2,0)) print(c)
得到一個形狀為4*3*2的陣列:
array([[[ 0,12],[ 4,16],[ 8,20]],[[ 1,13],17],[ 9,21]],[[ 2,[ 6,18],22]],[[ 3,15],[ 7,19],[11,23]]])
7.resize函式和reshape函式的功能一樣,但resize會直接修改所操作的陣列
b.resize((2,12))
print(b)
得到 2*12 的兩維陣列
[[ 0 1 2 3 4 5 6 7 8 9 10 11]
[12 13 14 15 16 17 18 19 20 21 22 23]]
並且這一步不可以通過賦值來實現,如下所示:
e = b.resize((2,12))
print(e)
此時結果為:
None
8.swapaxes(ax1,ax2) : 將陣列n個維度中兩個維度進行調換,不改變原陣列
b = a.reshape(2,4) c = b.swapaxes(0,2) print(c)
得到一個形狀為4*3*2的陣列(可以和6.transpose函式進行比較來看):
array([[[ 0,23]]])
以上這篇淺談numpy中函式resize與reshape,ravel與flatten的區別就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。