【问题标题】:How to mimic larger periodic array in Python如何在 Python 中模拟更大的周期性数组
【发布时间】:2021-01-14 09:39:11
【问题描述】:

我想将一对 d 维数组传递给 scipy.signal.correlate,但我希望它被计算为好像两个输入在每个方向上都是周期性的。因此,在一维中,如果我的数组是 [1,2,3][4,5,6],我想传递给 scipy.signal.correlate [1,2,3,1,2,3,1,2,3][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 倍内存。

【问题讨论】:

  • 请重新填写tour,阅读what's on-topic hereHow to Ask,并提供minimal reproducible example。 “为我实现此功能”与此站点无关。您必须做出诚实的尝试,然后针对您的算法或技术提出具体问题。
  • @PranavHosangadi 我已经尝试过了。我已经查看了几种 python 数组操作方法,但原则上似乎没有一种方法能满足我的需要。我不是要求一个完整的实现,我是在问是否有一个内置的 python 方法或来自其他包的方法,甚至原则上可以做我所要求的。什么,我应该列出我发现不起作用的每个内置函数吗?
  • 不,但至少你应该包括你最好的尝试,以及为什么它不符合你的要求。如果您确实做出了诚实的尝试,为什么要保密呢?分享您的尝试只会帮助人们回答您的问题 - 它为您的需求提供更多背景信息,让我们避免通过建议您尝试但没有奏效的东西来浪费您和我们的时间,并使您的问题不像“为我做 X” 只是试图将 StackOverflow 用作免费在线编码服务的问题。

标签: python signal-processing numpy-ndarray in-memory


【解决方案1】:

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

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)

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

【讨论】:

  • 这原则上是我想要的大小为 3x3 的二维数组的结果,但代码需要不知道数组的维数和大小,这两者都不是.
  • 它不是作为可用的代码,只是为了指出发生了什么。
猜你喜欢
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多