NumPy Tutorials

高效向NumPy数组添加元素

Spread the love

高效向NumPy数组添加元素

NumPy是Python科学计算生态系统的基石,它提供了强大的N维数组对象。这些数组比标准Python列表具有显著的性能优势,但是直接追加元素并不像人们预期的那样简单或高效。本教程探讨了向NumPy数组追加元素的高效替代方法。

目录

引言

NumPy数组设计用于高效的数值运算。它们的固定大小对这种效率贡献很大。与动态调整大小的Python列表不同,尝试使用类似于列表的append()方法直接向NumPy数组追加元素会导致错误。这是因为调整大小需要创建一个全新的数组,复制旧数据,然后添加新元素——这是一个计算代价高昂的操作,特别是对于大型数组和频繁追加的情况。

为什么避免直接追加?

直接向NumPy数组追加元素效率低下,因为它涉及到重复创建数组和复制数据。这会导致性能显著下降,尤其是在处理大型数据集或频繁追加操作时。内存分配和数据传输的开销远远超过了简单追加的益处。

预分配

最有效的方法通常是预先分配所需最终大小的数组,然后迭代地填充它。这避免了重复追加中固有的重复数组创建。


import numpy as np

size = 1000
arr = np.empty(size, dtype=int)  # 指定dtype以获得更好的性能

for i in range(size):
    arr[i] = i * 2  #填充一些值

print(arr)

连接

numpy.concatenate有效地沿现有轴连接现有数组。当您有多个要组合的数组时,这是理想的选择。


import numpy as np

arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])

arr_combined = np.concatenate((arr1, arr2))
print(arr_combined)  # 输出: [1 2 3 4 5 6]

arr3 = np.array([[1,2],[3,4]])
arr4 = np.array([[5,6],[7,8]])
arr_combined_2d = np.concatenate((arr3,arr4), axis=0) #axis=0用于垂直连接,axis=1用于水平连接
print(arr_combined_2d)

垂直和水平堆叠

对于数组的垂直(行方向)和水平(列方向)堆叠,numpy.vstacknumpy.hstack提供了方便的函数。


import numpy as np

arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])

arr_vstack = np.vstack((arr1, arr2))  # 垂直堆叠
arr_hstack = np.hstack((arr1, arr2))  # 水平堆叠

print("垂直堆叠:n", arr_vstack)
print("n水平堆叠:n", arr_hstack)

列表推导式和数组创建

对于从可迭代对象构建数组,列表推导式结合numpy.array可以简洁高效。


import numpy as np

arr = np.array([i**2 for i in range(10)])
print(arr)

选择合适的方法

最佳方法取决于您的具体用例:

  • 预分配:最适合顺序填充大型数组。
  • concatenate理想用于连接多个现有数组。
  • vstack/hstack方便用于垂直或水平堆叠。
  • 列表推导式 + numpy.array简洁地从可迭代对象创建数组。

结论

虽然NumPy数组不像Python列表那样支持直接追加,但存在高效的替代方法。了解这些方法对于编写高性能数值代码至关重要。尽可能优先使用预分配以获得最佳效率。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注