2014-10-18 4 views
2

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

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

#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] однако это дает мало или вообще не SpeedUp

и

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()] 
Смежные вопросы