簡體   English   中英

在Cython中聲明一個numpy布爾掩碼

[英]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_tbool

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字節的開銷,掩碼每個元素僅需要一個字節。

我們還可以看到, False0表示, True1

print (a<.5).view(np.uint8)
[1 0 1 ..., 0 0 1]

使用cast=True可以訪問基礎數組中的原始字節,這是數組內存的reinterpret_cast。

是一些舊信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM