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-05
OpenCV學(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-01
linux中使用Python對(duì)圖片進(jìn)行批量命名
大家好,本篇文章主要講的是linux中使用Python對(duì)圖片進(jìn)行批量命名,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
Python基于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-01
Python使用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

