首页 > 解决方案 > 如何在 Python 中模拟更大的周期性数组

问题描述

我想将一对 d 维数组传递给 scipy.signal.correlate,但我希望它被计算为好像两个输入在每个方向上都是周期性的。所以,在一维中,如果我的数组是[1,2,3]and [4,5,6],我想传递给 scipy.signal.correlate [1,2,3,1,2,3,1,2,3]and [4,5,6,4,5,6,4,5,6],这将给我一个大小为 17 的新数组,然后我将剪掉中间的 9 个元素。但是,如果可能的话,我不想在内存中实际复制输入数组的完整数据,这会将输入的大小乘以 3^d,而只是提供数组的视图,就好像它们是平铺的一样变成一个大 3^d 的超立方体。虽然,我知道相关函数的输出仍然会给我一个比输入数组大小的 3^d 倍大得多的结果。

numpy.tile似乎做我想做的事。

a = [[1, 2, 3], 
     [2, 4, 6],  
     [3, 6, 9]]
tiled_a = numpy.tile(a, numpy.ones(a.ndim, int) * 3)
print(tiled)

正确产生

[[1 2 3 1 2 3 1 2 3]
 [2 4 6 2 4 6 2 4 6]
 [3 6 9 3 6 9 3 6 9]
 [1 2 3 1 2 3 1 2 3]
 [2 4 6 2 4 6 2 4 6]
 [3 6 9 3 6 9 3 6 9]
 [1 2 3 1 2 3 1 2 3]
 [2 4 6 2 4 6 2 4 6]
 [3 6 9 3 6 9 3 6 9]]

但我不相信这只是一个视图,而是实际占用了原始数组的 9 倍内存。

标签: pythonsignal-processingnumpy-ndarrayin-memory

解决方案


我不确定这是否有帮助,但是 - wrt你上面的例子 - 看看:

l1 = [1, 2, 3] * 3
l2 = [2, 4, 6] * 3
l3 = [3, 6, 9] * 3
m = [l1, l2, l3, l1, l2, l3, l1, l2, l3]
print(m)
m[0][0] = 100
print(m)

前 3 个数组m必须存储数据,其余指向前 3 个。如果这不是您感兴趣的,请告诉我:如果不是,我将删除答案。


推荐阅读