【问题标题】:Cython : memory-efficient padding of arrayCython:数组的内存高效填充
【发布时间】:2017-12-15 05:41:29
【问题描述】:

我有一个 M×N numpy 数组。在 FFT 之前,我需要用零填充它以获得 (M+K)×(N+K) 数组,其中 M 和 N 第一个索引是原始数据,每个维度的最后 K 个索引为零。

使用 Cython,有没有一种有效的方法可以在不丢失 np.ndarray[DTYPE_t, ndim=2] 类型的情况下做到这一点?

【问题讨论】:

  • 我认为最节省内存的是使用ndarray.resize,然后将数组中的数据移动到正确的位置。

标签: python arrays numpy cython


【解决方案1】:

填充数组的一种方法是创建一个大小合适的目标,然后复制值:

In [137]: M,N,K = 10,20,5
In [138]: source = np.arange(M*N).reshape(M,N)
In [139]: target = np.zeros((M+K, N+K), dtype=source.dtype)
In [140]: target[:M, :N] = source

没有比这更高效的内存了。

我看不出cython 对内存使用有何帮助,因为内存使用取决于源数组和目标数组的大小,而不是处理方法。

我什至不确定它是否会更快,尤其是如果您希望 target 成为可用于解释型 Python 的 numpy 数组。如果源和目标都键入 memoryview,则复制可能会更快,但我们必须对其进行测试。

【讨论】:

  • 这就是我最终要做的。谢谢 ! Cython 不用于此目的,但我需要在 Cython 模块中使用此功能。
【解决方案2】:

以下将把你的数组变成一个填充的版本而不改变它的类型:

array = np.hstack((array,np.zeros((np.size(array,0),K))))
array = np.vstack((array,np.zeros((K,np.size(array,1)))))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 2013-06-24
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多