Python笔记:操作ndarray元素:访问、删除、插入

本文详细介绍了如何使用NumPy库进行数组元素的访问、修改、删除及插入等基本操作,并展示了垂直堆叠与水平堆叠的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引入

import numpy as np

在此引入一次,下面直接使用 np

访问ndarray元素

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 中的元素。
  • 正索引表示从数组的开头访问元素,负索引表示从数组的末尾访问元素。
  • 正索引从 0 开始,负索引从 -1 开始。

修改ndarray元素

  • 修改秩为 1 的 ndarray :
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]
  • 修改秩为 2 的 ndarray
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]]

删除ndarray元素

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]]
  • 对于秩为 1 的 ndarray,不需要使用关键字 axis
  • 对于秩为 2 的 ndarray,axis = 0 表示选择行,axis = 1 表示选择列。

插入ndarray元素

  • 使用 np.append(ndarray, elements, axis) 函数向 ndarray 中附加值

    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]]
    
    
    • 该函数会将给定的元素列表沿着指定的轴附加到 ndarray 中。
    • 当我们将行或列附加到秩为 2 的 ndarray 中时,行或列的形状必须正确,以与秩为 2 的 ndarray 的形状相符。
  • 使用 np.insert(ndarray, index, elements, axis) 函数向 ndarray 中插入值

    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]]
    
  • 此函数会将给定的元素列表沿着指定的轴插入到 ndarray 中,并放在给定的索引前面。

  • 使用 np.vstack() 函数进行垂直堆叠,或使用 np.hstack() 函数进行水平堆叠。

    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]]
    
<think>好的,我现在需要帮助用户解决如何向NumPy的ndarray添加数据的问题。首先,我要回想一下用户之前的问题,他们之前询问过如何转换为os.urandom格式,现在转向了NumPy数组的操作,可能是在进行数据处理或科学计算的项目中。 用户的问题是关于如何向np.ndarray添加数据。我需要先确认用户对NumPy的基本了解程度。可能他们已经有了一个现有的数组,想要动态地添加元素,但不知道正确的方法。NumPy数组是固定大小的,所以直接追加数据并不像列表那样简单,需要使用特定的函数。 接下来,我需要考虑不同的添加数据的情况,比如在末尾追加、在开头插入、在中间插入,或者合并多个数组。常见的函数有np.append(),但需要注意它的工作方式,因为NumPy数组是连续的存储结构,频繁追加可能效率不高。这时候需要解释清楚np.append()会生成新数组而不是修改原数组,同时提醒用户如果频繁操作,可能需要考虑其他数据结构如列表,最后再转换回数组。 另外,用户可能还会关心如何按行或列添加数据,比如在二维数组中添加行或列。这时候需要提到np.vstack()和np.hstack(),或者np.concatenate()函数,并给出相应的示例。同时,需要注意维度匹配的问题,否则会抛出错误。 还有可能用户想在一个循环中逐步构建数组,这时候需要提醒初始化空数组的问题,因为NumPy的空数组可能不会按预期工作,建议先使用列表收集数据,最后转换为数组,这样更高效。 此外,需要考虑用户是否了解视图和副本的概念,比如np.append()返回的是新数组,原数组不变,所以需要赋值回原变量才能实现“添加”的效果。同时,插入数据可以使用np.insert(),但同样需要注意原数组是否被修改。 用户可能的误区是认为可以像列表一样直接修改数组大小,所以需要明确说明NumPy数组的不可变性,以及为什么推荐预先分配空间或使用列表转换的方法。还要比较不同方法的效率,比如np.append()在循环中使用会导致多次复制数据,影响性能,这时候提供替代方案。 最后,总结不同场景下的最佳实践,帮助用户根据具体需求选择合适的方法,比如小规模数据可以使用np.append(),大规模数据则用列表转换,或者预先分配足够空间。同时,强调维度一致性的重要性,避免运行时错误。</think>--- ### **一、NumPy 数组的特性** NumPy 的 `ndarray` 是**固定大小的连续内存块**,与 Python 列表不同,它不支持直接动态扩展。添加数据时需通过**创建新数组**或**预分配内存**实现。以下是常见操作: --- ### **二、添加数据的 4 种方法** #### **1. `np.append()` 函数** - **功能**:在数组末尾追加元素(生成新数组,原数组不变)。 - **语法**:`np.append(arr, values, axis=None)` - **示例**: ```python import numpy as np arr = np.array([1, 2, 3]) new_arr = np.append(arr, [4, 5]) # 返回新数组 [1 2 3 4 5] ``` #### **2. `np.concatenate()` 函数** - **功能**:沿指定轴拼接多个数组(更高效)。 - **语法**:`np.concatenate((arr1, arr2, ...), axis=0)` - **示例**: ```python arr1 = np.array([[1, 2], [3, 4]]) arr2 = np.array([[5, 6]]) combined = np.concatenate((arr1, arr2), axis=0) # 按行拼接 # 结果:[[1 2], [3 4], [5 6]] ``` #### **3. `np.vstack()` 与 `np.hstack()`** - **用途**:垂直(按行)或水平(按列)堆叠数组。 - **示例**: ```python # 垂直堆叠(添加行) new_row = np.array([[7, 8]]) v_stack = np.vstack([arr1, new_row]) # [[1 2], [3 4], [7 8]] # 水平堆叠(添加列) new_col = np.array([[9], [10]]) h_stack = np.hstack([arr1, new_col]) # [[1 2 9], [3 4 10]] ``` #### **4. 预分配内存 + 切片赋值** - **适用场景**:大规模数据追加时提高效率。 - **示例**: ```python # 预分配一个足够大的数组 original = np.array([1, 2, 3]) new_data = [4, 5, 6] expanded = np.zeros(len(original) + len(new_data), dtype=int) expanded[:len(original)] = original expanded[len(original):] = new_data # 结果:[1 2 3 4 5 6] ``` --- ### **三、不同维度的操作** #### **1. 一维数组** - **直接追加**: ```python arr = np.array([1, 2, 3]) arr = np.append(arr, [4]) # 生成新数组并覆盖原变量 ``` #### **2. 二维数组** - **按行添加**: ```python matrix = np.array([[1, 2], [3, 4]]) new_row = np.array([[5, 6]]) matrix = np.vstack([matrix, new_row]) ``` - **按列添加**: ```python new_col = np.array([[7], [8]]) matrix = np.hstack([matrix, new_col]) ``` --- ### **四、性能与注意事项** 1. **避免循环中频繁追加**: - 错误示范: ```python arr = np.array([]) for i in range(1000): arr = np.append(arr, i) # 每次复制数据,效率极低 ``` - 正确做法: ```python temp_list = [] for i in range(1000): temp_list.append(i) arr = np.array(temp_list) # 一次性转换 ``` 2. **维度匹配**: - 拼接时必须保持维度一致,例如二维数组无法直接与一维数组拼接。 3. **数据类型一致性**: - 若追加的数据类型与原数组不同,会自动向上转型(如 `int` → `float`)。 --- ### **五、总结** | **方法** | **适用场景** | **特点** | |------------------|--------------------------|-----------------------------| | `np.append()` | 少量数据追加 | 简单但效率低(生成新数组) | | `np.concatenate` | 多数组拼接 | 高效且灵活 | | `vstack/hstack` | 明确行/列方向的添加 | 代码可读性高 | | 预分配内存 | 大规模数据操作 | 内存管理最优 | **建议**:优先选择 `np.concatenate()` 或列表预收集策略,避免在循环中使用 `np.append()`。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值