如何在 cython 中声明一组数组?
更准确地说,我想构造(声明然后初始化)一个 m x n 矩阵,将其称为 A,其中每个条目 [i,j] 都是一维 double 组(长度 min (i,j)
,用零填充)
cdef np.ndarray[np.double_t, ndim=1] A[i,j]
A[i,j] = np.zeros((min(i,j)), dtype=np.double)
对于 (m,n)=(4,3),print A
应该返回如下内容:
[[[], [], []],
[[], [0.], [0.]],
[[], [0.], [0.,0.]],
[[], [0.], [0.,0.]]]
如何声明和初始化 A?
最佳答案
对象方法:
import numpy
def thing(int m, int n):
cdef int i, j
cdef object[:, :] A = numpy.empty((m, n), dtype=object)
for i in range(A.shape[0]):
for j in range(A.shape[1]):
A[i, j] = numpy.zeros(min(i, j))
return A
请注意,object[:, :]
语法是较新的版本,numpy.ndarray[object, ndim=2]
版本已弃用。较新的版本是无 GIL 的(好吧,可能不是在使用 object
类型时),通常更快(从不慢),类型不可知(适用于任何支持 memoryview
的东西)和清洁工。
如果你想遍历子数组,你会这样做:
for i in range(A.shape[0]):
for j in range(A.shape[1]):
subarray = A[i, j]
for k in range(subarray.size):
...
并且您可以将 subarray
键入 object
(最适合小型 subarray
)或 float[:]
(最适合大型 子数组
)。
事实证明,C 级解决方案非常棘手。我有一种感觉,你基本上最终会用纯 C 类型来编写它。
所以我放弃了,这是我要做的:
import numpy
def thing(int m, int n):
cdef int i, j
cdef float[:, :, :] A = numpy.zeros((m, n, min(m, n)), dtype=float)
cdef int[:, :] A_lengths = numpy.empty((m, n), dtype=int)
for i in range(A_lengths.shape[0]):
for j in range(A_lengths.shape[1]):
A_lengths[i, j] = min(i, j)
return A, A_lengths
基本上,制作一个 3D 数组和一个相应长度的 2D 数组。如果长度只有线性变化(因此最大长度是平均长度的一个合理因素 [我想最多大约 10]),那么这应该有可接受的开销。它将允许纯 C 计算,同时拥有漂亮的内存 View 界面。
这就是我的全部。要么接受要么离开。
关于python - cython 中的数组数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19054756/