查看: 263|回复: 0

NumPy ndarray元素访问修改删除与插入实践

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
NumPy 的 ndarray 是科学计算和数据处理中高频使用的数据结构。围绕 ndarray 的元素级操作,原文给出了从索引访问、赋值修改,到 np.delete 删除、np.append/np.insert 插入,再到 np.vstack/np.hstack 堆叠的完整示例。下面按一维和二维数组场景重新整理这些代码与参数含义,便于在脚本中直接套用。

一、访问元素:正索引与负索引
在 NumPy 中,访问 ndarray 元素使用方括号加索引:x。正索引从 0 开始,表示从数组开头计数;负索引从 -1 开始,表示从数组末尾计数。对于一维数组,x[-5] 在长度为 5 的数组中对应第一个元素,x[-1] 对应最后一个元素。
  1. import numpy as np
  2. x = np.array([1, 2, 3, 4, 5])
  3. print()
  4. print('x = ', x)
  5. print()
  6. print('This is First Element in x:', x[0])
  7. print('This is Second Element in x:', x[1])
  8. print('This is Fifth (Last) Element in x:', x[4])
  9. print()
  10. print('This is First Element in x:', x[-5])
  11. print('This is Second Element in x:', x[-4])
  12. print('This is Fifth (Last) Element in x:', x[-1])
复制代码

输出:
  1. x = [1 2 3 4 5]
  2. This is First Element in x: 1
  3. This is Second Element in x: 2
  4. This is Fifth (Last) Element in x: 5
  5. This is First Element in x: 1
  6. This is Second Element in x: 2
  7. This is Fifth (Last) Element in x: 5
复制代码

二、修改元素:直接按索引赋值
一维 ndarray 可以通过 x[索引] = 新值 修改。二维 ndarray 则通过 X[行索引, 列索引] = 新值 定位并修改元素。
  1. x = np.array([1, 2, 3, 4, 5])
  2. print()
  3. print('Original:\n x = ', x)
  4. print()
  5. x[3] = 20
  6. print('Modified:\n x = ', x)
复制代码

输出:
  1. Original:
  2. x = [1 2 3 4 5]
  3. Modified:
  4. x = [ 1 2 3 20 5]
复制代码

二维数组修改示例:
  1. X = np.array([[1,2,3],[4,5,6],[7,8,9]])
  2. print()
  3. print('Original:\n X = \n', X)
  4. print()
  5. X[0,0] = 20
  6. print('Modified:\n X = \n', X)
复制代码

输出:
  1. Original:
  2. X =
  3. [[1 2 3]
  4. [4 5 6]
  5. [7 8 9]]
  6. Modified:
  7. X =
  8. [[20 2 3]
  9. [ 4 5 6]
  10. [ 7 8 9]]
复制代码

三、删除元素:np.delete 与 axis 参数
np.delete(ndarray, obj, axis) 用于删除元素或行列。一维数组不需要 axis,传入要删除的索引或索引列表即可。二维数组需要指定 axis:axis=0 表示按行操作,axis=1 表示按列操作。
  1. x = np.array([1, 2, 3, 4, 5])
  2. Y = np.array([[1,2,3],[4,5,6],[7,8,9]])
  3. print()
  4. print('Original x = ', x)
  5. x = np.delete(x, [0,4]) # 此处删除第一个和第五个(最后一个)元素
  6. print()
  7. print('Modified x = ', x)
  8. print()
  9. print('Original Y = \n', Y)
  10. w = np.delete(Y, 0, axis=0) # 此处删除第一行的元素
  11. v = np.delete(Y, [0,2], axis=1) # 此处删除第一列和第三列(最后一列)的元素
  12. print()
  13. print('w = \n', w)
  14. print()
  15. print('v = \n', v)
复制代码

输出:
  1. Original x = [1 2 3 4 5]
  2. Modified x = [2 3 4]
  3. Original Y =
  4. [[1 2 3]
  5. [4 5 6]
  6. [7 8 9]]
  7. w =
  8. [[4 5 6]
  9. [7 8 9]]
  10. v =
  11. [[2]
  12. [5]
  13. [8]]
复制代码

这里的关键点是:一维 ndarray 删除时不需要 axis;二维 ndarray 中 axis=0 选择行,axis=1 选择列。np.delete 返回处理后的新数组,因此需要用变量接收结果。

四、插入与追加:np.append 和 np.insert
np.append(ndarray, elements, axis) 会把给定元素列表沿指定轴附加到 ndarray。对一维数组,可以直接追加标量,也可以用列表一次追加多个值。对二维数组,追加行时 axis=0,追加列时 axis=1,并且行或列的形状必须与原数组的形状匹配。
  1. x = np.array([1, 2, 3, 4, 5])
  2. Y = np.array([[1,2,3],[4,5,6]])
  3. print()
  4. print('Original x = ', x)
  5. x = np.append(x, 6) # 秩为1的ndarray,直接append
  6. print()
  7. print('x = ', x)
  8. x = np.append(x, [7,8]) # 秩为1的ndarray,也可通过列表一次添加多个
  9. print()
  10. print('x = ', x)
  11. print()
  12. print('Original Y = \n', Y)
  13. v = np.append(Y, [[7,8,9]], axis=0) # 秩为2的ndarray,添加一行
  14. q = np.append(Y,[[9],[10]], axis=1) # 秩为2的ndarray,添加一列; 当然也可添加两列 q = np.append(Y,[[9,99],[10,100]], axis=1)
  15. print()
  16. print('v = \n', v)
  17. print()
  18. print('q = \n', q)
复制代码

输出:
  1. Original x = [1 2 3 4 5]
  2. x = [1 2 3 4 5 6]
  3. x = [1 2 3 4 5 6 7 8]
  4. Original Y =
  5. [[1 2 3]
  6. [4 5 6]]
  7. v =
  8. [[1 2 3]
  9. [4 5 6]
  10. [7 8 9]]
  11. q =
  12. [[ 1 2 3 9]
  13. [ 4 5 6 10]]
复制代码

np.insert(ndarray, index, elements, axis) 则用于在指定索引前插入值。对一维数组,np.insert(x,2,[3,4]) 表示在第三个元素前插入 3 和 4。对二维数组,axis=0 按行插入,axis=1 按列插入。
  1. x = np.array([1, 2, 5, 6, 7])
  2. Y = np.array([[1,2,3],[7,8,9]])
  3. print()
  4. print('Original x = ', x)
  5. x = np.insert(x,2,[3,4]) # 向秩为1的ndarray第三个元素前插入3和4
  6. print()
  7. print('x = ', x)
  8. print()
  9. print('Original Y = \n', Y)
  10. w = np.insert(Y,1,[4,5,6],axis=0) # 向秩为2的ndarray第二行前,插入4,5,6
  11. v = np.insert(Y,1,5, axis=1) # 向秩为2的ndarray前第二列前,插入5
  12. print()
  13. print('w = \n', w)
  14. print()
  15. print('v = \n', v)
复制代码

输出:
  1. Original x = [1 2 5 6 7]
  2. x = [1 2 3 4 5 6 7]
  3. Original Y =
  4. [[1 2 3]
  5. [7 8 9]]
  6. w =
  7. [[1 2 3]
  8. [4 5 6]
  9. [7 8 9]]
  10. v =
  11. [[1 5 2 3]
  12. [7 5 8 9]]
复制代码

五、堆叠数组:vstack 与 hstack
如果不想逐个插入,还可以用 np.vstack() 做垂直堆叠,用 np.hstack() 做水平堆叠。示例中,x 先放在 Y 上方生成 z;再把 x 通过 reshape(2,1) 变形后放到 Y 右侧生成 w。
  1. x = np.array([1,2])
  2. Y = np.array([[3,4],[5,6]])
  3. print()
  4. print('x = ', x)
  5. print()
  6. print('Y = \n', Y)
  7. z = np.vstack((x,Y)) # 此处将x置于Y之上,形成新的ndarray
  8. w = np.hstack((Y,x.reshape(2,1))) # 此处将变形后的x置于Y的右侧,形成新的ndarray
  9. print()
  10. print('z = \n', z)
  11. print()
  12. print('w = \n', w)
复制代码

输出:
  1. x = [1 2]
  2. Y =
  3. [[3 4]
  4. [5 6]]
  5. z =
  6. [[1 2]
  7. [3 4]
  8. [5 6]]
  9. w =
  10. [[3 4 1]
  11. [5 6 2]]
复制代码

小结:本文涉及的 ndarray 操作围绕索引、axis 和形状匹配展开。访问和修改使用方括号索引;删除使用 np.delete,插入使用 np.append 与 np.insert,堆叠使用 np.vstack 与 np.hstack。二维数组操作中,axis=0 对应行,axis=1 对应列;追加行或列时,形状必须正确,以与二维 ndarray 的形状相符。由于这些函数通常返回新的 ndarray,实际脚本中应使用变量接收返回值。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-9-14 11:34 , Processed in 0.021865 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部