Я хочу сделать boolean
Numpy массив в Cython с заданным размером другого numpy.array, но это вызывает сообщение об ошибке:Создание булева массива
CosmoTest.pyx
import numpy as np
cimport numpy as np
cimport cython
from libcpp cimport bool
x=np.array([[-0.3,1.2],[2.5,0.82],[0.61,-0.7]])
mask= np.ones_like(x,dtype=bool)
ошибка:
mask= np.ones_like(x,dtype=bool)
^
------------------------------------------------------------
CosmoTest.pyx:318:39: 'bool' is not a constant, variable or function identifier
Как это должно быть определено в cython?
Update:
cpdef np.ndarray arc(np.ndarray x):
cdef np.ndarray[double, ndim=1, mode='c'] out = np.zeros_like(x)
cdef np.ndarray[np.uint8_t,cast=True, ndim=1] mask = (x < 0.999).view(dtype=np.uint8)
if mask.any():
out[mask] = 0.5*np.log((1.+((1.-x[mask])/(x[mask]+1.))**0.5)/(1.-((1.-x[mask])/(x[mask]+1.))**0.5))/(1-x[mask]**2)**0.5
cdef np.ndarray[np.uint8_t,cast=True, ndim=1] mask = (x > 1.001).view(dtype=np.uint8)
if mask.any():
out[mask] = np.arctan(((x[mask]-1.)/(x[mask]+1.))**0.5)/(x[mask]**2 - 1)**0.5
cdef np.ndarray[np.uint8_t,cast=True , ndim=1] mask = ((x >= 0.999) & (x <= 1.001)).view(dtype=np.uint8)
if mask.any():
out[mask] = 5./6. - x[mask]/3.
return out
Сообщение об ошибке:
Error compiling Cython file:
------------------------------------------------------------
...
if mask.any():
out[mask] = 0.5*np.log((1.+((1.-x[mask])/(x[mask]+1.))**0.5)/(1.-((1.-x[mask])/(x[mask]+1.))**0.5))/(1-x[mask]**2)**0.5
cdef np.ndarray[np.uint8_t,cast=True, ndim=1] mask = (x > 1.001).view(dtype=np.uint8)
if mask.any():
out[mask] = np.arctan(((x[mask]-1.)/(x[mask]+1.))**0.5)/(x[mask]**2 - 1)**0.5
^
------------------------------------------------------------
CosmoTest.pyx:9:55: local variable 'mask' referenced before assignment
В принципе, я хочу сделать эту операцию, и мне интересно, как это должно быть сделано с вашим подходом 'cdef np.ndarray [np.uint8, cast = True] mask = (x> 0.01)'? – Dalek
@Dalek Единственное, что вы ошиблись в строке, которую вы просто указали, - это добавить '_t' после' np.uint8' (т. Е. 'Np.ndarray [np.uint8_t, cast = True] ...') , Необходимость добавления '_t' при указании типов numpy в операторах' cdef' - это просто странность cython. – DavidW
Для справки, в Cython вы можете использовать маску, как для логической индексации (т. Е. 'X [mask] = 10' отлично работает). Если вы передадите маску обратно в Python, сделайте это как 'return mask.view (dtype = np.bool)' – DavidW