2 回答

TA貢獻1998條經驗 獲得超6個贊
所以我不相信內存視圖實際上支持布爾索引。因此,要索引數組,您總是需要做
np.asarray(mc.data)[mask]
# or
mc.data.base[mask] # if you're sure it's always a view of something that supports boolean indexing)
我認為這不會隨著@ead 提到的 Cython 更新而改變。我懷疑這樣做的原因是賦值 ( mc.data[mask] = x) 可能相當容易,但是應該返回什么類型并不明顯mc.data[mask]——它不是內存視圖。
因此,無論您做什么,都會涉及一些混亂的代碼。
對于分配給內存視圖的部分,可以使用
mc.mask = (np.asarray(mc.data) > 0.5).view(np.uint8)
并將其返回到一個 Numpy bool 數組:
np.asarray(mc.mask).view(np.bool)
兩者都不應該涉及復制。
如果是我設計這個,我會保持 memoryviews 非公開(僅供 Cython 使用)并具有僅保存 Python 接口的底層 Numpy 數組的普通對象屬性。您可以使用property使它們保持同步(并進行強制轉換):
cdef class MyClass:
cdef np.uint8_t[:] mask_mview
cdef object _mask
@property
def mask(self):
return np.asarray(self._mask).view(np.bool)
@mask.setter
def mask(self, value):
self._mask = value
self.mask_view = value.view(np.uint8)
# and the same for data
這樣,您就有了一個 memoryview 可用于 memoryviews 擅長的事情(在 Cython 中逐個元素快速迭代),訪問 Python 的普通 Numpy 數組,并且兩者保持同步(至少通過 Python 接口)。

TA貢獻1803條經驗 獲得超6個贊
您最好的選擇(如果您不想使用解決方法)可能是等待 Cython 0.29.14 發布。此問題已修復,可能會成為0.29.14的一部分。
以下最小示例
%%cython
import numpy as np
cimport numpy as np
cdef np.uint8_t[:] mask = np.random.rand(20)>.5
將無法正常導入
ValueError:不理解字符緩沖區 dtype 格式字符串('?')
對于 Cython 0.29.13,但使用github(或 master)上 0.29.x-branch的當前狀態。
添加回答
舉報