gpt4 book ai didi

python - cython 中的数组数组

转载 作者:太空狗 更新时间:2023-10-29 22:30:52 25 4
gpt4 key购买 nike

如何在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com