在 1d NumPy 数组中向左或向右移动一系列项目的有效方法是什么?
What's an efficient way to shift a range of items left or right within an 1d NumPy array?
假设我有一个这样的数组:
arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
我想向左或向右移动给定范围的项目。例如,从位置 4 开始向右移动 3 个位置:
>>> shift(arr, 4, 3)
arr = [0, 1, 2, 3, 4, 5, 6, 4, 5, 6, 7]
或从位置 4 开始向左移动:
>>> shift(arr, 4, -3)
arr = [0, 4, 5, 6, 4, 5, 6, 7, 5, 6, 7]
我把原来的物品留在原地,但不管什么东西留在原来的位置,也就是那一系列物品所在的位置。可以是零或其他任何东西 - 无论如何我都会覆盖它。
我是 NumPy 的新手,但我认为可能有一些切片语法可以使用 NumPy 来完成此操作,但我无法想出如何完成此操作。
另一种方法是循环并逐个复制项目,但我希望有一种更有效/更优雅的方法来做到这一点。
感谢任何帮助!
您需要提取要移动的数组部分(从 position
到数组末尾减去移动量(如果为正数)),然后替换数组的部分从新位置 (position + shift
) 提取该块。这将保留原始值。
def shift(arr, pos, amt):
arrv = arr[pos:min(len(arr)-amt, len(arr))]
arr[pos+amt:pos+amt+len(arrv)] = arrv
arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
shift(arr, 4, 3)
print(arr)
shift(arr, 4, -3)
print(arr)
输出:
[0, 1, 2, 3, 4, 5, 6, 4, 5, 6, 7]
[0, 4, 5, 6, 4, 5, 6, 7, 5, 6, 7]
假设我有一个这样的数组:
arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
我想向左或向右移动给定范围的项目。例如,从位置 4 开始向右移动 3 个位置:
>>> shift(arr, 4, 3)
arr = [0, 1, 2, 3, 4, 5, 6, 4, 5, 6, 7]
或从位置 4 开始向左移动:
>>> shift(arr, 4, -3)
arr = [0, 4, 5, 6, 4, 5, 6, 7, 5, 6, 7]
我把原来的物品留在原地,但不管什么东西留在原来的位置,也就是那一系列物品所在的位置。可以是零或其他任何东西 - 无论如何我都会覆盖它。
我是 NumPy 的新手,但我认为可能有一些切片语法可以使用 NumPy 来完成此操作,但我无法想出如何完成此操作。
另一种方法是循环并逐个复制项目,但我希望有一种更有效/更优雅的方法来做到这一点。
感谢任何帮助!
您需要提取要移动的数组部分(从 position
到数组末尾减去移动量(如果为正数)),然后替换数组的部分从新位置 (position + shift
) 提取该块。这将保留原始值。
def shift(arr, pos, amt):
arrv = arr[pos:min(len(arr)-amt, len(arr))]
arr[pos+amt:pos+amt+len(arrv)] = arrv
arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
shift(arr, 4, 3)
print(arr)
shift(arr, 4, -3)
print(arr)
输出:
[0, 1, 2, 3, 4, 5, 6, 4, 5, 6, 7]
[0, 4, 5, 6, 4, 5, 6, 7, 5, 6, 7]