我试图用Cython和多处理包在共享内存中定义一个数组。但是,我无法在.pxd文件中声明此数组。
简单的测试代码如下。我有一个带有变量my_data的Cython类数据。这个变量my_data将是共享数组。
Data.pxd:
cimport numpy as np
cdef class Data:
cdef public np.ndarray my_data
Data.pyx:
cdef class Data:
def __init__(self):
pass
然后,我在主文件中声明共享数组:
main_file.py:
# -*- coding: utf-8 -*-
import pyximport;
import numpy as np
from multiprocessing import Array
pyximport.install(setup_args={"include_dirs":np.get_include()},)
from Data import *
### Create Data
N = 1500
dc = Data()
dc.my_data = Array('d', N, lock=False)
运行main_file.py会产生TypeError:
TypeError: Cannot convert c_double_Array_1500 to numpy.ndarray
我试图将my_data声明为cpython数组,但是它提供了相同的TypeError。 有没有办法在Data.pxd中声明my_data,以便可以与多处理器共享?
答案 0 :(得分:0)
你遇到的问题是multiprocessing.Array
不是一个numpy数组,而是一个“ctypes数组”(根据the multiprocessing documentation)。
使其工作的最简单方法是使用Cython typed memoryview功能,该功能接受任何具有阵列接口的功能:
# Data.pxd
cdef class Data:
cdef public double[:] my_data
当我进行此更改时,您的程序运行正常,并且还可以使用numpy数组,python数组以及您尝试抛出的大多数其他内容。
请注意,此版本中不灵活的一件事是数组是一个双精度数组,您没有指定。如果你需要在这里接受任何数据类型(而不仅仅是双打),你很可能不能轻易地使用cdef类型。