日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python中的np array函数_numpy中的np.ascontiguousarray()函数

發(fā)布時(shí)間:2023/12/2 python 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python中的np array函数_numpy中的np.ascontiguousarray()函数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

"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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。