python中的np array函数_numpy中的np.ascontiguousarray()函数
"Return a contiguous array (ndim >= 1) in memory (C order)."
用途
ascontiguousarray函數(shù)將一個(gè)內(nèi)存不連續(xù)存儲(chǔ)的數(shù)組轉(zhuǎn)換為內(nèi)存連續(xù)存儲(chǔ)的數(shù)組,使得運(yùn)行速度更快。
C order vs Fortran order
C order 指的是行優(yōu)先的順序(Row-major Order),即內(nèi)存中同行的元素存在一起,
Fortran Order則指的是列優(yōu)先的順序(Column-major Order),即內(nèi)存中同列的元素存在一起。
Pascal, C,C++,Python都是行優(yōu)先存儲(chǔ)的,而Fortran,MatLab是列優(yōu)先存儲(chǔ)的。
Contiguous array
contiguous array指的是數(shù)組在內(nèi)存中存放的地址也是連續(xù)的(注意內(nèi)存地址實(shí)際是一維的)。
2維數(shù)組arr = np.arange(12).reshape(3,4)。數(shù)組結(jié)構(gòu)如下
在內(nèi)存里中實(shí)際存儲(chǔ)如下:
arr是 C order 的,在內(nèi)存是行優(yōu)先的。如果想要向下移動(dòng)一列,則需要跳過3個(gè)塊(例如,從0到4只需要跳過1,2和3)。
如果經(jīng)過轉(zhuǎn)置,arr.T沒有了C連續(xù)特性,因?yàn)閮?nèi)存中元素的地址不變,同一行中的相鄰元素在內(nèi)存中不是連續(xù)的:
這時(shí),arr.T變成了Fortran order,因?yàn)橄噜徚兄械脑卦趦?nèi)存中是相鄰存儲(chǔ)的。
從性能上來說,獲取內(nèi)存中相鄰的地址比不相鄰的地址速度要快很多(從RAM讀取一個(gè)數(shù)值的時(shí)候可以連著一起讀一塊地址中的數(shù)值,并且可以保存在Cache中),這意味著對(duì)連續(xù)數(shù)組的操作會(huì)快很多。
由于arr是C連續(xù)的,因此對(duì)其進(jìn)行行操作比進(jìn)行列操作速度要快。通常來說
np.sum(arr, axis=1) # 按行求和
會(huì)比
np.sum(arr, axis=0) # 按列求和
稍微快些。 同理,在arr.T上,列操作比行操作會(huì)快些。
使用 np.ascontiguousarray()
Numpy中,隨機(jī)初始化的數(shù)組默認(rèn)都是C連續(xù)的。
經(jīng)過不規(guī)則的slice操作,則會(huì)改變連續(xù)性,可能會(huì)變成既不是C連續(xù),也不是Fortran連續(xù)的。
可以通過數(shù)組的.flags屬性,查看一個(gè)數(shù)組是C連續(xù)還是Fortran連續(xù)的
>>> import numpy as np
>>> arr = np.arange(12).reshape(3, 4)
>>> arr.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : False
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
從輸出可以看到數(shù)組arr是C連續(xù)的。 對(duì)arr進(jìn)行按列的slice操作,不改變每行的值,則還是C連續(xù)的:
>>> arr
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> arr1 = arr[:2, :]
>>> arr1
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7]])
>>> arr1.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : False
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
如果進(jìn)行在行上的slice,則會(huì)改變連續(xù)性,成為既不C連續(xù),也不Fortran連續(xù)的:
>>> arr1 = arr[:, 1:3]
>>> arr1.flags
C_CONTIGUOUS : False
F_CONTIGUOUS : False
OWNDATA : False
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
此時(shí)利用ascontiguousarray函數(shù),可以將其變?yōu)檫B續(xù)的:
>>> arr2 = np.ascontiguousarray(arr1)
>>> arr2.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
參考
本篇文章由一文多發(fā)平臺(tái)ArtiPub自動(dòng)發(fā)布
總結(jié)
以上是生活随笔為你收集整理的python中的np array函数_numpy中的np.ascontiguousarray()函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ps法线贴图插件_法线与置换贴图原理讲解
- 下一篇: python a and b_pytho