0

我想了解如何使用 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 浮点数组,因此欢迎对上述实现进行任何改进。

4

0 回答 0