【Python】NumPy 中 ravel() 正确打开方式
【Python】NumPy 中 ravel() 正確打開方式
最近在看書時,對numpy的ravel()的有些疑惑,書上這樣寫到“如果結(jié)果中的值在原始數(shù)組中是連續(xù)的,則ravel 不會生成底層數(shù)值的副本”,度娘后,發(fā)現(xiàn)大部分的說法都是得到原數(shù)組的視圖,但是按照書上的說法,是可以產(chǎn)生副本的,只要結(jié)果的值在原始數(shù)組中不連續(xù)。
剛開始不太理解,這里所謂的連續(xù)是指什么?后來發(fā)現(xiàn),這個連續(xù)是指的是元素順序,reval()中有個參數(shù)【order】,這個參數(shù)指定了重塑順序。
In [58]: arr2 Out[58]: array([[ 1, 1, -1],[ 0, -3, 6]]) # arr2 默認(rèn)安裝C順序展開 In [59]: arr3 = np.ravel(arr2,order = 'C') # C順序,即是按行方向順序 In [60]: arr3 Out[60]: array([ 1, 1, -1, 0, -3, 6]) # arr2,arr3都是按照C順序展開 In [72]: arr3.base is arr2 # arr3基于arr2 Out[72]: True In [73]: np.may_share_memory(arr2,arr3) # arr3,arr2共享內(nèi)存,則arr3為arr2的視圖 Out[73]: True In [62]: arr4 = np.ravel(arr2,order = 'F') #arr4 按照F順序,即是列順序重塑 In [63]: arr4 Out[63]: array([ 1, 0, 1, -3, -1, 6]) #可以看出順序與arr2的不同 In [64]: arr4.base is arr2 #arr4 不是基于arr2 Out[64]: False In [65]: np.may_share_memory(arr2,arr4) #arr4,arr2 不共享內(nèi)存 Out[65]: False In [74]: arr4.flags.owndata #arr4擁有自己的數(shù)據(jù),說明獨(dú)立于arr2,是一個副本 Out[74]: True In [66]: arr5 = np.ravel(arr2.T, order='A') #A順序,應(yīng)該是針對于轉(zhuǎn)置后的重塑 In [67]: arr5 Out[67]: array([ 1, 1, -1, 0, -3, 6]) #得到結(jié)果順序與arr2的一致,也是C順序 In [68]: np.may_share_memory(arr2,arr5) # arr5,arr2共享內(nèi)存,則arr5為arr2的視圖 Out[68]: True In [69]: arr6 = np.ravel(arr2.swapaxes(0,1), order='K') #A順序,應(yīng)該是針對于軸交換后的重塑 In [70]: arr6 Out[70]: array([ 1, 1, -1, 0, -3, 6]) #得到結(jié)果順序與arr2的一致,也是C順序 In [71]: np.may_share_memory(arr2,arr6) # arr6,arr2共享內(nèi)存,則arr6為arr2的視圖 Out[71]: True所以ravel()的結(jié)果不一定就是原數(shù)組的視圖,這個要看具體的情況,不過一般重塑都是使用默認(rèn)的order參數(shù),按照C順序重塑,但是使用時也要注意,避免錯把視圖當(dāng)做副本,修改視圖影響原本的數(shù)組。
或者直接使用flatten(),不管參數(shù)【order】如何都是,返回一份拷貝,對拷貝所做的修改不會影響(reflects)原始數(shù)組,
最后,也可以通過reshape(-1)使原多維數(shù)組轉(zhuǎn)化為一維數(shù)組,reshape(x, y)使其轉(zhuǎn)化為其他形狀,不過注意使用reshape()都是返回原始數(shù)組的視圖。
總結(jié)下,
1,reshape() 返回原始數(shù)組的視圖;
2,ravel() 返回原始數(shù)據(jù)的視圖或者副本,只有在參數(shù)order = ‘F’時返回副本;
3,flatten() 返回原始數(shù)組的副本;
以上有錯誤的,可以評論指出,拍磚!!!
總結(jié)
以上是生活随笔為你收集整理的【Python】NumPy 中 ravel() 正确打开方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java弹窗代码_JAVA的弹窗怎么做?
- 下一篇: bootstrap-datepicker