如何在Python中模仿较大的周期数组

问题描述

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

numpy.tile似乎可以满足我的要求。

a = [[1,3],[2,6],[3,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倍。

解决方法

我不确定是否有帮助,但是-w.r.t.您上面的示例-查看:

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

m中的前3个数组必须存储数据,其余的指向前3个数组。请让我知道您是否不感兴趣:如果没有,我将删除答案。