Numpy中数组索引的平移
在本文中,我们将介绍Numpy中数组索引的平移(shift)。在NumPy数组中,当需要对一定数量的元素进行操作时,我们通常使用数组的切片(handling slicing)。然而,有时候我们需要向数组中的所有元素添加、移动或删除步长(shift the indices)。这时,我们就需要使用Numpy中的shift函数。
阅读更多:Numpy 教程
shift函数介绍
shift函数是NumPy中的数组平移函数,可以用于将数组的索引向左或向右移动。函数语法如下:
numpy.shift(arr, shift, axis=None)
参数说明:
– arr: 数组
– shift: 移动次数,正数表示向右移动,负数表示向左移动
– axis: 移动方向的轴,不指定则将所有元素视为单个数组,按照某种顺序移动所有元素。
shift原理是将所有元素索引上Ac:aC平移shift个位置,Dc:dC上的元素平移到Dc+shift:dC+shift上,EFgh上的元素平移到EF:gh+shift上,接下来可以看个例子更清晰理解:
import numpy as np
arr = np.arange(10)
# 向右移动2位,未删除元素
print(np.shift(arr, 2))
# 输出: [0 0 0 0 0 0 0 1 2 3]
# 向左移动2位,未删除元素
print(np.shift(arr, -2))
# 输出: [2 3 4 5 6 7 8 9 0 0]
# 删除元素并向右移动2位
print(np.shift(arr[2:],-2))
# 输出: [2 3 0 0 0 0 0 0 0]
指定移动方向
我们也可以指定移动方向的轴,让数组只在特定的方向上进行移动。在下面的例子中,我们将对一个多维数组进行前向和后向移动,以改变其结构:
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print('Original array:\n', arr)
# 沿非主轴前向移动1步
print('\nShifted along axis 0:\n', np.shift(arr, 1, axis=0))
# 沿非主轴后向移动1步
print('\nShifted along axis 0:\n', np.shift(arr, -1, axis=0))
# 沿主轴前向1步移动
print('\nShifted along axis 1:\n', np.shift(arr, 1, axis=1))
# 沿主轴后向1步移动
print('\nShifted along axis 1:\n', np.shift(arr, -1, axis=1))
上面例子中,我们可以使用“axis”参数指定沿哪个方向移动。
numpy.roll: 循环移位
numpy.roll也可以实现沿指定轴移动数组的元素,只是它是循环移位。可以将指定轴上的最后n个元素移动到最前面。语法如下:
numpy.roll(array, shift, axis=None)
参数说明:
– array:数组
– shift:移动次数,正数表示向右移动,负数表示向左移动
– axis:移动方向的轴,不指定则将所有元素视为单个数组,按照某种顺序移动所有元素。
我们来看一个例子:
arr = np.arange(10)
# 向右移动2位,将最后的元素移动到最前面
print(np.roll(arr, 2))
# 输出: [8 9 0 1 2 3 4 5 6 7]
# 向左移动2位,将最前面的元素移动到最后面
print(np.roll(arr, -2))
# 输出: [2 3 4 5 6 7 8 9 0 1]
# 沿矩阵的主轴roll
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(np.roll(arr, 1))
# 输出: [[9 1 2]
# [3 4 5]
# [6 7 8]]
可以看出,roll函数的区别是轴上滚动到末尾重新开始。这是一种常用的技术,比如加密和压缩算法中经常使用循环移位。
总结
本文中,我们基于Numpy给大家介绍了数组索引的平移(shift)实现。shift函数和roll函数都是Numpy中实现数组平移的函数,其中shift函数可以实现任意轴方向的平移,而roll函数实现的是循环移位。以上是本文的主要内容,希望对大家在Numpy的使用方面有所帮助。
极客教程