python中的np array函数_numpy中的np.ascontiguousarray()函数
"Return a contiguous array (ndim >= 1) in memory (C order)."
用途
ascontiguousarray函數將一個內存不連續存儲的數組轉換為內存連續存儲的數組,使得運行速度更快。
C order vs Fortran order
C order 指的是行優先的順序(Row-major Order),即內存中同行的元素存在一起,
Fortran Order則指的是列優先的順序(Column-major Order),即內存中同列的元素存在一起。
Pascal, C,C++,Python都是行優先存儲的,而Fortran,MatLab是列優先存儲的。
Contiguous array
contiguous array指的是數組在內存中存放的地址也是連續的(注意內存地址實際是一維的)。
2維數組arr = np.arange(12).reshape(3,4)。數組結構如下
在內存里中實際存儲如下:
arr是 C order 的,在內存是行優先的。如果想要向下移動一列,則需要跳過3個塊(例如,從0到4只需要跳過1,2和3)。
如果經過轉置,arr.T沒有了C連續特性,因為內存中元素的地址不變,同一行中的相鄰元素在內存中不是連續的:
這時,arr.T變成了Fortran order,因為相鄰列中的元素在內存中是相鄰存儲的。
從性能上來說,獲取內存中相鄰的地址比不相鄰的地址速度要快很多(從RAM讀取一個數值的時候可以連著一起讀一塊地址中的數值,并且可以保存在Cache中),這意味著對連續數組的操作會快很多。
由于arr是C連續的,因此對其進行行操作比進行列操作速度要快。通常來說
np.sum(arr, axis=1) # 按行求和
會比
np.sum(arr, axis=0) # 按列求和
稍微快些。 同理,在arr.T上,列操作比行操作會快些。
使用 np.ascontiguousarray()
Numpy中,隨機初始化的數組默認都是C連續的。
經過不規則的slice操作,則會改變連續性,可能會變成既不是C連續,也不是Fortran連續的。
可以通過數組的.flags屬性,查看一個數組是C連續還是Fortran連續的
>>> 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
從輸出可以看到數組arr是C連續的。 對arr進行按列的slice操作,不改變每行的值,則還是C連續的:
>>> 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
如果進行在行上的slice,則會改變連續性,成為既不C連續,也不Fortran連續的:
>>> arr1 = arr[:, 1:3]
>>> arr1.flags
C_CONTIGUOUS : False
F_CONTIGUOUS : False
OWNDATA : False
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
此時利用ascontiguousarray函數,可以將其變為連續的:
>>> arr2 = np.ascontiguousarray(arr1)
>>> arr2.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
參考
本篇文章由一文多發平臺ArtiPub自動發布
總結
以上是生活随笔為你收集整理的python中的np array函数_numpy中的np.ascontiguousarray()函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ps法线贴图插件_法线与置换贴图原理讲解
- 下一篇: 调用支付jsapi缺少参数:total_