Оптимизация булевой индексации Cython

Каков наилучший способ преобразовать следующий код в cython

Учитывая следующий пример:

#setup example data Z and A
Z = np.random.randn(10,10)
A = np.random.randn(10,10)
A[0,1] = np.nan
A[1,3] = np.nan
A[5,3] = np.nan
A[3,5] = np.nan

B = np.isnan(A).transpose()

C = Z[B * B.transpose()]

Я хочу оптимизировать определение типа np.ndarray B в приведенном выше примере и оптимизировать создание ndarray C,

Я попытался использовать настройку B для uint8 и python и C++ bools.

cdef np.ndarray[np.uint8_t, ndim=2, cast=True] однако это приводит к небольшому ускорению или его отсутствию

а также

cdef np.ndarray[bool, ndim=2, cast=True]

где bool либо from cpython cimport bool или же from libcpp cimport bool в обоих случаях приведенный выше код выдаст ошибку.

1 ответ

Решение

Правильный способ создать буфер, который будет принимать np.nan значения использует np.float_t или же np.double_t, Если вы попытаетесь использовать целочисленный буфер, появится следующая ошибка:

ValueError: cannot convert float Nan to integer

Затем вы можете использовать что-то вроде:

cdef np.ndarray[np.double_t, ndim=2] A, Z

Z = np.random.randn(10,10)
A = np.random.randn(10,10)
A[0,1] = np.nan
A[1,3] = np.nan
A[5,3] = np.nan
A[3,5] = np.nan
B = np.isnan(A).transpose()
C = Z[B * B.transpose()]
Другие вопросы по тегам