python - cython 中的数组数组

标签 python arrays numpy cython

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

相关文章:

python - 在 numpy 中获取平均面积的有效方法

python - 什么 python 库用于 OSX 上的非阻塞音频 I/O?

python - 从 mysql 打印/解析 csv blob 文件

Python:列表理解中某处出错了?

javascript - 如何使用两个参数创建 item.split 方法?

c++ - 当涉及数组时,我们可以安全地从 C++ 调用 C API 函数吗?

python - 在 genfromtxt next(fhd) 中,添加新的 "with open file"行时出现 StopIteration 错误

python - 根据列表有条件地创建组框

python - 如何以行 block 的形式检查进程的持续时间?

javascript - javascript新手,使用数组