我想了解如何使用 gmpy2 数据类型定义数组/类型化内存视图。我不明白如何初始化这样的数组。我目前非常基本的尝试如下所示:
from gmpy2 cimport *
import_gmpy2() # needed to initialize the C-API
cdef extern from "gmp.h":
void mpz_set_si(mpz_t, long)
cpdef void test():
cdef mpz z[2]
cdef mpz[:] z_view = z
z_view[:] = GMPy_MPZ_New(NULL)
mpz_set_si(MPZ(z_view[0]), -7)
mpz_set_si(MPZ(z_view[1]), 3)
print(z[0] + z[1])
该错误是由于 test() 的第一行,Cython 不明白我试图定义一个形状为 2 的数组,而是将其解释为 Python 对象的数组元素。
一个类似的实现,但使用整数:
# Memoryview on a C array
cdef int z[2]
cdef int [:] z_view = z
编辑:
看着这个关于制作 cdef 类列表的问题,我似乎已经成功了。
from gmpy2 cimport *
import numpy as np
import_gmpy2() # needed to initialize the C-API
cdef extern from "gmp.h":
void mpz_set_si(mpz_t, long)
cpdef void test():
cdef mpz[:] z
cdef Py_ssize_t i
z = np.array([GMPy_MPZ_New(NULL) for i in range(2)],dtype=mpz)
mpz_set_si(MPZ(z[0]), -7)
mpz_set_si(MPZ(z[1]), 3)
print(z[0] + z[1])
我仍然不确定制作类列表的限制是否扩展到制作 gmpy2 数据类型列表,如果今天仍然存在这样的限制,以及是否可以对上述初始化 gmpy2 整数的方式进行改进。
我打算制作和操作大型 gmpy2 浮点数组,因此欢迎对上述实现进行任何改进。