1. 程式人生 > 程式設計 >淺談numpy中函式resize與reshape,ravel與flatten的區別

淺談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的區別就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。