Numpy Cython自定义数据类型ndarray

Numpy Cython自定义数据类型ndarray,numpy,cython,custom-data-type,Numpy,Cython,Custom Data Type,我已经为我的np.ndarray创建了一个数据类型: particle_t = np.dtype([ ('position', float, 2), ('momentum', float, 2), ('velocity', float, 2), ('force', float, 2), ('charge', int, 1), ]) 根据官方的例子,我们可以称之为: def my_func(np.ndarray[dtype, dim] particles)

我已经为我的np.ndarray创建了一个数据类型:

particle_t = np.dtype([
    ('position', float, 2),
    ('momentum', float, 2),
    ('velocity', float, 2),
    ('force', float, 2),
    ('charge', int, 1),
])
根据官方的例子,我们可以称之为:

def my_func(np.ndarray[dtype, dim] particles):
但当我尝试编译时:

def tester(np.ndarray[particle_t, ndim = 1] particles):
我得到
无效类型
错误。我看到的另一种可能的用法是内存视图,如
int[:]
。尝试使用def检测仪(粒子[:]粒子):会导致:
“particle\u t”不是类型标识符


我如何解决这个问题?

显然,
particle\u t
对于Cython来说不是一个类型,而是一个Python对象

它类似于作为Python对象的
np.int32
,因此

def tester(np.ndarray[np.int32] particles):     #doesn't work!
       pass
不起作用,您需要使用相应的类型,即
np.int32\t

 def tester(np.ndarray[np.int32_t] particles):  #works!
      pass
但是
粒子的对应类型是什么?您需要创建一个压缩结构,它将镜像您的numpy类型。以下是一个简化版本:

#Python code:
particle_t = np.dtype([
    ('position', np.float64, 2), #It is better to specify the number of bytes exactly!
    ('charge', np.int32, 1),  #otherwise you might be surprised...
])
和相应的Cython代码:

%%cython
import numpy as np
cimport numpy as np

cdef packed struct cy_particle_t:
    np.float64_t position_x[2]
    np.int32_t   charge

def tester(np.ndarray[cy_particle_t, ndim = 1] particles):
    print(particles[0])
它不仅可以编译和加载,还可以按照广告的方式工作:

>>> t=np.zeros(2, dtype=particle_t)
>>> t[:]=42
>>> tester(t)
{'charge': 42, 'position_x': [42.0, 42.0]}

指定字节数(在python代码中)是否意味着使用np.float64而不仅仅是float?是的。至少对我来说,
np.float比
np.float
更清晰。以上都是整数:例如,
np.int\u t
的大小取决于平台(Linux64(8字节)与Windows64(4字节)),可以不同于
int
(Linux64上8字节与4字节)的大小,因为它在内部映射到
long
而不是
int
。我在将
long
传递到函数时遇到了一些错误,尽管我从未将任何东西定义为
long
。谢谢分配,这解决了这个问题。