NumPy 的 ndarray 是科学计算和数据处理中高频使用的数据结构。围绕 ndarray 的元素级操作,原文给出了从索引访问、赋值修改,到 np.delete 删除、np.append/np.insert 插入,再到 np.vstack/np.hstack 堆叠的完整示例。下面按一维和二维数组场景重新整理这些代码与参数含义,便于在脚本中直接套用。
一、访问元素:正索引与负索引
在 NumPy 中,访问 ndarray 元素使用方括号加索引:x。正索引从 0 开始,表示从数组开头计数;负索引从 -1 开始,表示从数组末尾计数。对于一维数组,x[-5] 在长度为 5 的数组中对应第一个元素,x[-1] 对应最后一个元素。
- import numpy as np
- x = np.array([1, 2, 3, 4, 5])
- print()
- print('x = ', x)
- print()
- print('This is First Element in x:', x[0])
- print('This is Second Element in x:', x[1])
- print('This is Fifth (Last) Element in x:', x[4])
- print()
- print('This is First Element in x:', x[-5])
- print('This is Second Element in x:', x[-4])
- print('This is Fifth (Last) Element in x:', x[-1])
复制代码
输出:
- x = [1 2 3 4 5]
- This is First Element in x: 1
- This is Second Element in x: 2
- This is Fifth (Last) Element in x: 5
- This is First Element in x: 1
- This is Second Element in x: 2
- This is Fifth (Last) Element in x: 5
复制代码
二、修改元素:直接按索引赋值
一维 ndarray 可以通过 x[索引] = 新值 修改。二维 ndarray 则通过 X[行索引, 列索引] = 新值 定位并修改元素。
- x = np.array([1, 2, 3, 4, 5])
- print()
- print('Original:\n x = ', x)
- print()
- x[3] = 20
- print('Modified:\n x = ', x)
复制代码
输出:
- Original:
- x = [1 2 3 4 5]
- Modified:
- x = [ 1 2 3 20 5]
复制代码
二维数组修改示例:
- X = np.array([[1,2,3],[4,5,6],[7,8,9]])
- print()
- print('Original:\n X = \n', X)
- print()
- X[0,0] = 20
- print('Modified:\n X = \n', X)
复制代码
输出:
- Original:
- X =
- [[1 2 3]
- [4 5 6]
- [7 8 9]]
- Modified:
- X =
- [[20 2 3]
- [ 4 5 6]
- [ 7 8 9]]
复制代码
三、删除元素:np.delete 与 axis 参数
np.delete(ndarray, obj, axis) 用于删除元素或行列。一维数组不需要 axis,传入要删除的索引或索引列表即可。二维数组需要指定 axis:axis=0 表示按行操作,axis=1 表示按列操作。
- x = np.array([1, 2, 3, 4, 5])
- Y = np.array([[1,2,3],[4,5,6],[7,8,9]])
- print()
- print('Original x = ', x)
- x = np.delete(x, [0,4]) # 此处删除第一个和第五个(最后一个)元素
- print()
- print('Modified x = ', x)
- print()
- print('Original Y = \n', Y)
- w = np.delete(Y, 0, axis=0) # 此处删除第一行的元素
- v = np.delete(Y, [0,2], axis=1) # 此处删除第一列和第三列(最后一列)的元素
- print()
- print('w = \n', w)
- print()
- print('v = \n', v)
复制代码
输出:
- Original x = [1 2 3 4 5]
- Modified x = [2 3 4]
- Original Y =
- [[1 2 3]
- [4 5 6]
- [7 8 9]]
- w =
- [[4 5 6]
- [7 8 9]]
- v =
- [[2]
- [5]
- [8]]
复制代码
这里的关键点是:一维 ndarray 删除时不需要 axis;二维 ndarray 中 axis=0 选择行,axis=1 选择列。np.delete 返回处理后的新数组,因此需要用变量接收结果。
四、插入与追加:np.append 和 np.insert
np.append(ndarray, elements, axis) 会把给定元素列表沿指定轴附加到 ndarray。对一维数组,可以直接追加标量,也可以用列表一次追加多个值。对二维数组,追加行时 axis=0,追加列时 axis=1,并且行或列的形状必须与原数组的形状匹配。
- x = np.array([1, 2, 3, 4, 5])
- Y = np.array([[1,2,3],[4,5,6]])
- print()
- print('Original x = ', x)
- x = np.append(x, 6) # 秩为1的ndarray,直接append
- print()
- print('x = ', x)
- x = np.append(x, [7,8]) # 秩为1的ndarray,也可通过列表一次添加多个
- print()
- print('x = ', x)
- print()
- print('Original Y = \n', Y)
- v = np.append(Y, [[7,8,9]], axis=0) # 秩为2的ndarray,添加一行
- q = np.append(Y,[[9],[10]], axis=1) # 秩为2的ndarray,添加一列; 当然也可添加两列 q = np.append(Y,[[9,99],[10,100]], axis=1)
- print()
- print('v = \n', v)
- print()
- print('q = \n', q)
复制代码
输出:
- Original x = [1 2 3 4 5]
- x = [1 2 3 4 5 6]
- x = [1 2 3 4 5 6 7 8]
- Original Y =
- [[1 2 3]
- [4 5 6]]
- v =
- [[1 2 3]
- [4 5 6]
- [7 8 9]]
- q =
- [[ 1 2 3 9]
- [ 4 5 6 10]]
复制代码
np.insert(ndarray, index, elements, axis) 则用于在指定索引前插入值。对一维数组,np.insert(x,2,[3,4]) 表示在第三个元素前插入 3 和 4。对二维数组,axis=0 按行插入,axis=1 按列插入。
- x = np.array([1, 2, 5, 6, 7])
- Y = np.array([[1,2,3],[7,8,9]])
- print()
- print('Original x = ', x)
- x = np.insert(x,2,[3,4]) # 向秩为1的ndarray第三个元素前插入3和4
- print()
- print('x = ', x)
- print()
- print('Original Y = \n', Y)
- w = np.insert(Y,1,[4,5,6],axis=0) # 向秩为2的ndarray第二行前,插入4,5,6
- v = np.insert(Y,1,5, axis=1) # 向秩为2的ndarray前第二列前,插入5
- print()
- print('w = \n', w)
- print()
- print('v = \n', v)
复制代码
输出:
- Original x = [1 2 5 6 7]
- x = [1 2 3 4 5 6 7]
- Original Y =
- [[1 2 3]
- [7 8 9]]
- w =
- [[1 2 3]
- [4 5 6]
- [7 8 9]]
- v =
- [[1 5 2 3]
- [7 5 8 9]]
复制代码
五、堆叠数组:vstack 与 hstack
如果不想逐个插入,还可以用 np.vstack() 做垂直堆叠,用 np.hstack() 做水平堆叠。示例中,x 先放在 Y 上方生成 z;再把 x 通过 reshape(2,1) 变形后放到 Y 右侧生成 w。
- x = np.array([1,2])
- Y = np.array([[3,4],[5,6]])
- print()
- print('x = ', x)
- print()
- print('Y = \n', Y)
- z = np.vstack((x,Y)) # 此处将x置于Y之上,形成新的ndarray
- w = np.hstack((Y,x.reshape(2,1))) # 此处将变形后的x置于Y的右侧,形成新的ndarray
- print()
- print('z = \n', z)
- print()
- print('w = \n', w)
复制代码
输出:
- x = [1 2]
- Y =
- [[3 4]
- [5 6]]
- z =
- [[1 2]
- [3 4]
- [5 6]]
- w =
- [[3 4 1]
- [5 6 2]]
复制代码
小结:本文涉及的 ndarray 操作围绕索引、axis 和形状匹配展开。访问和修改使用方括号索引;删除使用 np.delete,插入使用 np.append 与 np.insert,堆叠使用 np.vstack 与 np.hstack。二维数组操作中,axis=0 对应行,axis=1 对应列;追加行或列时,形状必须正确,以与二维 ndarray 的形状相符。由于这些函数通常返回新的 ndarray,实际脚本中应使用变量接收返回值。 |