如何在numpy中对称地移动数组

Posted

技术标签:

【中文标题】如何在numpy中对称地移动数组【英文标题】:How to shift array symmetrically in numpy 【发布时间】:2022-01-22 14:48:56 【问题描述】:

我对 Python 非常陌生,并且对堆栈溢出提出了一些问题,因此对于任何格式错误,我深表歉意。

我正在使用 numpy 在 Python 中处理一个自相关数组,我想在使用自相关作为偶函数的属性的同时移动一个保存其值的数组。例如,我有一个数组说,

a = [0,1,2,3,4]

我希望能够以这样的方式移动数组,使其移动但保持关于数字 0(或自相关的原点)对称,并且看起来像这样的序列:

    a = [1,0,1,2,3]
    a = [2,1,0,1,2]
    a = [3,2,1,0,1]
    a = [4,3,2,1,0]

有没有简单的方法来做到这一点?我考虑过使用 numpy 的滚动和翻转功能,但它们似乎并没有完全完成我想要做的事情。任何帮助/建议将不胜感激,谢谢!

编辑:

我的问题的一个更具代表性的示例是尝试执行以下转换,其中 1 表示我的函数原点的值:

a = [1, 0.34, 0.59, 0.40, 0.94]
a = [0.34, 1, 0.34, 0.59, 0.40]
a = [0.59, 0.34, 1, 0.34, 0.59]
a = [0.40, 0.59, 0.34, 1, 0.34]
a = [0.94, 0.40, 0.59, 0.34, 1]

再次感谢您的任何建议/帮助!

【问题讨论】:

【参考方案1】:

您可以为所有出现在零之前或等于零的元素添加 +1,并为所有出现在零之后的元素添加 -1。这是一种方法:

values = np.array([1, 0.34, 0.59, 0.40, 0.94])
a = np.array([0,1,2,3,4])
for i in range(a.size):
  print(values[a])
  a += 2 * (np.arange(a.size) <= a.argmin()) - 1

# [1.   0.34 0.59 0.4  0.94]
# [0.34 1.   0.34 0.59 0.4 ]
# [0.59 0.34 1.   0.34 0.59]
# [0.4  0.59 0.34 1.   0.34]
# [0.94 0.4  0.59 0.34 1.  ]

或者,您可以使用带有负范围的np.arange 并采用绝对值:

for i in range(0, -5, -1):
  print(np.abs(np.arange(i,i+5)))

您还可以一次性生成所有移位行的矩阵:

mat = np.eye(5, dtype=int).cumsum(0).cumsum(0)
mat += np.rot90(mat, k=2) - np.eye(5, dtype=int) - 1

[[0 1 2 3 4]
 [1 0 1 2 3]
 [2 1 0 1 2]
 [3 2 1 0 1]
 [4 3 2 1 0]]

【讨论】:

感谢您的回复。我很抱歉,但我应该更具体地回答这个问题。问题数组中的值只是一个示例,我无法调整它们的实际值,因为数组将在每次计算自相关函数时包含随机十进制数。如果您知道,是否有替代功能可以做到这一点? 也许你可以用一个更有代表性的例子来更新这个问题? 一种方法是保持应用移位到索引数组,然后索引值(如在编辑中)。 非常感谢您的帮助!我认为这解决了我的问题,非常感谢您的建议。

以上是关于如何在numpy中对称地移动数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在numpy中优雅地通过子数组重新排列数组?

如何在 python 中明智地组合两个 numpy 数组元素?

如何在python 3中有效地将原始字节写入numpy数组数据

如何保存 numpy 数组以便以后可以适当地加载它们?

如何正确地将 numpy 数组传递给 Cython 函数?

使用 PySide 时,如何有效地将数据从 NumPy 数组传输到 QPolygonF?