[英]Declaring a numpy boolean mask in Cython
如何在Cython中聲明布爾型掩碼的類型? 我真的需要聲明嗎? 這是示例:
cpdef my_func(np.ndarray[np.double_t, ndim = 2] array_a,
np.ndarray[np.double_t, ndim = 2] array_b,
np.ndarray[np.double_t, ndim = 2] array_c):
mask = ((array_a > 1) & (array_b == 2) & (array_c == 3)
array_a[mask] = 0.
array_b[mask] = array_c[mask]
return array_a, array_b, array_c
您需要通過np.ndarray[np.uint8_t, ndim = 2, cast=True] mask = ...
來“投射” np.uint8_t
以bool
cimport numpy as np
cpdef my_func(np.ndarray[np.double_t, ndim = 2] array_a,
np.ndarray[np.double_t, ndim = 2] array_b,
np.ndarray[np.double_t, ndim = 2] array_c):
cdef np.ndarray[np.uint8_t, ndim = 2, cast=True] mask = (array_a > 1) & (arr
ay_b == 2) & (array_c == 3)
array_a[mask] = 0.
array_b[mask] = array_c[mask]
return array_a, array_b, array_c
否則(沒有cast=True
),代碼將編譯但由於類型不匹配而在運行時拋出。
但是,您根本不需要定義mask
的類型,而可以將其用作python對象:將會有一些性能損失,或者更確切地說,是錯過了通過早期類型綁定來加快處理速度的機會,但就您而言,這可能並不重要。
還有一件事:我不知道您的真實代碼看起來如何,但是我希望您知道,cython根本不會加快您的示例的速度-與numpy相比,沒有任何收獲。
我們可以輕松地驗證bool-np.array每個值使用8位(至少在我的系統上)。 這一點一點都不明顯,例如,每個值只能使用一點(就像bitset
):
import sys
import numpy as np
a=np.random.random((10000,))
sys.getsizeof(a)
>>> 80096
sys.getsizeof(a<.5)
>>> 10096
很明顯,雙精度數組每個元素需要8個字節+ 86字節的開銷,掩碼每個元素僅需要一個字節。
我們還可以看到, False
由0
表示, True
由1
:
print (a<.5).view(np.uint8)
[1 0 1 ..., 0 0 1]
使用cast=True
可以訪問基礎數組中的原始字節,這是數組內存的reinterpret_cast。
這是一些舊信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.