如何在numpy中对称移动数组

How to shift array symmetrically in numpy

我是 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 的滚动和翻转功能,但它们似乎并没有完全完成我想要做的事情。任何 help/advice 将不胜感激,谢谢!

编辑:

我的问题的一个更具代表性的例子是尝试进行以下转换,其中 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]

再次感谢 advice/help!

您可以为出现在零之前或等于零的所有元素加 +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]]