Numpy之如何改變數(shù)組形狀
前言
本篇總結(jié)、介紹數(shù)組的基本操作之一——改變數(shù)組形狀 。
1. reshape
numpy.reshape(a, newshape, order=‘C')
在不改變數(shù)據(jù)的情況下為數(shù)組賦予新的形狀
a
:類(lèi)數(shù)組(array_like)。待重塑數(shù)組newshape
:整數(shù)(一維數(shù)組)或者整數(shù)列表/元組(高維數(shù)組)等。重塑之后的數(shù)組形狀(shape)。需要注意的是重塑之后的數(shù)組形狀要與待重塑數(shù)組的形狀相容order:{‘C’, ‘F’, ‘A’}
,可選參數(shù)。數(shù)據(jù)在計(jì)算機(jī)內(nèi)存中的存儲(chǔ)順序
>>> arr1 = np.arange(8) >>> arr1 array([0, 1, 2, 3, 4, 5, 6, 7]) ## 打印arr1形狀 >>> arr1.shape (8,) # 將arr1變換為二維數(shù)組 >>> arr2 = np.reshape(arr1,(2,4)) >>> arr2 array([[0, 1, 2, 3], [4, 5, 6, 7]]) ## 打印arr2形狀 >>> arr2.shape (2, 4) # 將arr1變換為三維數(shù)組 >>> arr3 = np.reshape(arr1,(2,2,2)) >>> arr3 array([[[0, 1], [2, 3]], [[4, 5], [6, 7]]]) ## 打印arr3形狀 >>> arr3.shape (2, 2, 2) # 將arr3轉(zhuǎn)換為一維數(shù)組 >>> arr4 = np.reshape(arr3,8) >>> arr4 array([0, 1, 2, 3, 4, 5, 6, 7]) ## 打印arr4形狀 >>> arr4.shape (8,) # 重塑之后的數(shù)組形狀要與待重塑數(shù)組的形狀相容,否則報(bào)錯(cuò) >>> arr5 = np.reshape(arr1,(3,3)) ValueError: cannot reshape array of size 8 into shape (3,3)
注釋?zhuān)?/strong>
newshape參數(shù)的其中一維可以是-1,表示該維度上的長(zhǎng)度會(huì)自動(dòng)根據(jù)數(shù)組的長(zhǎng)度及其余維度的長(zhǎng)度自動(dòng)推斷出來(lái)。
我們看一下下面的例子:
>>> arr1 = np.arange(8) >>> arr1 array([0, 1, 2, 3, 4, 5, 6, 7]) >>> arr2 = np.reshape(arr1,(2,-1)) >>> arr2 array([[0, 1, 2, 3], [4, 5, 6, 7]])
只能其中一維為-1:
>>> arr1 = np.arange(8) >>> arr1 array([0, 1, 2, 3, 4, 5, 6, 7]) >>> arr2 = np.reshape(arr1,(2,-1,-1)) ValueError: can only specify one unknown dimension
另外,需要注意numpy.reshape(a,(1,-1))與numpy.reshape(a,(-1,1))以及numpy.reshape(a,-1)的區(qū)別:
>>> arr1 = np.arange(8) >>> arr1 array([0, 1, 2, 3, 4, 5, 6, 7]) # numpy.reshape(a,(1,-1)) >>> arr2 = np.reshape(arr1,(1,-1)) >>> arr2 array([[0, 1, 2, 3, 4, 5, 6, 7]]) >>> arr2.shape (1, 8) # numpy.reshape(a,(-1,1)) >>> arr3 = np.reshape(arr1,(-1,1)) >>> arr3 array([[0], [1], [2], [3], [4], [5], [6], [7]]) >>> arr3.shape (8, 1) # numpy.reshape(a,-1) >>> arr4 = np.reshape(arr3,-1) >>> arr4 array([0, 1, 2, 3, 4, 5, 6, 7]) >>> arr4.shape (8,)
注釋?zhuān)?/strong>
每個(gè)Numpy數(shù)組(ndarray)的實(shí)例也都有自己的reshape方法(注意與函數(shù)reshape區(qū)別),其語(yǔ)法如下:
a.reshape(shape, order=‘C’):在不改變數(shù)據(jù)的情況下為數(shù)組賦予新的形狀(a為Numpy數(shù)組實(shí)例)
無(wú)論從語(yǔ)法還是功能上來(lái)說(shuō),Numpy數(shù)組的reshape方法和Numpy的reshape函數(shù)都一樣。
兩者的主要區(qū)別在于:
(1)Numpy的reshape函數(shù)可以直接對(duì)諸如python列表對(duì)象進(jìn)行操作(但返回的依然是Numpy ndarray對(duì)象),而Numpy數(shù)組的reshape方法則不行。
(2)Numpy數(shù)組的reshape方法支持形狀(shape)參數(shù)的每個(gè)元素作為單獨(dú)的參數(shù)傳入,而Numpy的reshape函數(shù)不行。
我們先來(lái)看一下第一點(diǎn):
# numpy.reshape函數(shù) >>> list1 = [0,1,2,3,4,5,6,7,8] >>> arr1 = np.reshape(list1,(3,3)) >>> arr1 array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) # ndarray.reshape方法 >>> list1.reshape(list1,(3,3)) AttributeError: 'list' object has no attribute 'reshape'
我們?cè)賮?lái)看一下第二點(diǎn):
# numpy.reshape函數(shù) ## 形狀參數(shù)作為一個(gè)整體傳入 >>> arr1 = np.arange(8) >>> np.reshape(arr1,(2,4)) array([[0, 1, 2, 3], [4, 5, 6, 7]]) ## 形狀參數(shù)單獨(dú)分開(kāi)傳入 >>> np.reshape(arr1,2,4) TypeError: order must be str, not int
# ndarray.reshape方法 ## 形狀參數(shù)作為一個(gè)整體傳入 >>> arr1 = np.arange(8) >>> arr1.reshape((2,4)) array([[0, 1, 2, 3], [4, 5, 6, 7]]) ## 形狀參數(shù)的元素單獨(dú)傳入 >>> arr1.reshape(2,4) array([[0, 1, 2, 3], [4, 5, 6, 7]])
注釋?zhuān)?/strong>
numpy.reshape和ndarray.reshape都不會(huì)改變?cè)瓟?shù)組的形狀。
2. ravel
numpy.ravel(a, order=‘C')
返回展平成一維的數(shù)組元素。
一般返回的是數(shù)組視圖(view),需要的時(shí)候(例如order改變)才會(huì)返回?cái)?shù)組的副本(copy)
a
:類(lèi)數(shù)組order:{‘C’,’F’, ‘A’, ‘K’}
,可選參數(shù)
注釋?zhuān)?/strong>
numpy.ravel和ndarray.ravel以及ndarray.reshape(-1)等同。
>>> arr1 = np.arange(8).reshape(2,2,2) >>> arr1 array([[[0, 1], [2, 3]], [[4, 5], [6, 7]]]) >>> np.ravel(arr1) array([0, 1, 2, 3, 4, 5, 6, 7]) >>> arr1.ravel() array([0, 1, 2, 3, 4, 5, 6, 7]) >>> arr1.reshape(-1) array([0, 1, 2, 3, 4, 5, 6, 7])
3. ndarray.flatten
ndarray.flatten(order=‘C')
返回坍塌成一維的數(shù)組的副本
order:{‘C’, ‘F’, ‘A’, ‘K’}
,可選參數(shù)
>>> arr1 = np.arange(8).reshape(2,2,2) >>> arr1 array([[[0, 1], [2, 3]], [[4, 5], [6, 7]]]) >>> arr1.flatten() array([0, 1, 2, 3, 4, 5, 6, 7])
注釋?zhuān)?/strong>
有關(guān)ravel和ndarray.flatten的區(qū)別和聯(lián)系:
- numpy.ravel、ndarray.ravel、ndarray.reshape(-1)以及ndarray.flatten都可以返回展平成一維的數(shù)組元素
- numpy.ravel、ndarray.ravel、ndarray.reshape(-1)返回的是數(shù)組的視圖,而ndarray.flatten返回的是數(shù)組的副本
>>> arr1 = np.arange(8).reshape(2,2,2) >>> arr1 array([[[0, 1], [2, 3]], [[4, 5], [6, 7]]]) >>> arr2 = arr1.reshape(-1) >>> arr2 array([0, 1, 2, 3, 4, 5, 6, 7]) >>> arr3 = arr1.ravel() >>> arr3 array([0, 1, 2, 3, 4, 5, 6, 7]) >>> arr4 = arr1.flatten() >>> arr4 array([0, 1, 2, 3, 4, 5, 6, 7]) >>> arr5 = arr1.ravel(order='F') >>> arr5 array([0, 4, 2, 6, 1, 5, 3, 7]) >>> arr1[0][0][1] = -1 # arr1改變后 >>> arr1 array([[[ 0, -1], [ 2, 3]], [[ 4, 5], [ 6, 7]]]) >>> arr2 array([ 0, -1, 2, 3, 4, 5, 6, 7]) >>> arr3 array([ 0, -1, 2, 3, 4, 5, 6, 7]) >>> arr4 array([0, 1, 2, 3, 4, 5, 6, 7]) >>> arr5 array([0, 4, 2, 6, 1, 5, 3, 7])
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
Reference
[1]: https://numpy.org/doc/stable/reference/routines.array-manipulation.html
[2]: https://www.runoob.com/numpy/numpy-copies-and-views.html
相關(guān)文章
用 Python 寫(xiě)的文檔批量翻譯工具效果竟然超出想象
這篇文章主要介紹了用 Python 寫(xiě)的文檔批量翻譯工具,效果竟然超越付費(fèi)軟件,這個(gè)非常適合python辦公自動(dòng)化腳本,非常不錯(cuò),實(shí)現(xiàn)方法也很簡(jiǎn)單,需要的朋友可以參考下2021-05-05OpenCV學(xué)習(xí)之圖像的分割與修復(fù)詳解
圖像分割本質(zhì)就是將前景目標(biāo)從背景中分離出來(lái)。在當(dāng)前的實(shí)際項(xiàng)目中,應(yīng)用傳統(tǒng)分割的并不多,大多是采用深度學(xué)習(xí)的方法以達(dá)到更好的效果。本文將詳細(xì)介紹一下OpenCV中的圖像分割與修復(fù),需要的可以參考一下2022-01-01linux中使用Python對(duì)圖片進(jìn)行批量命名
大家好,本篇文章主要講的是linux中使用Python對(duì)圖片進(jìn)行批量命名,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12Python基于Tkinter編寫(xiě)crc校驗(yàn)工具
這篇文章主要介紹了Python基于Tkinter編寫(xiě)crc校驗(yàn)工具,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05在python3中pyqt5和mayavi不兼容問(wèn)題的解決方法
今天小編就為大家分享一篇在python3中pyqt5和mayavi不兼容問(wèn)題的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Python使用Beautiful?Soup(BS4)庫(kù)解析HTML和XML
這篇文章介紹了Python使用Beautiful?Soup(BS4)庫(kù)解析HTML和XML的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06