如何在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]]
我是 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]]