我有两个
numpy.ndarray
具有不同形状的实例。如果我添加这两个数组,它们之间将发生广播:
import numpy as np
x = np.array([1, 2, 3])
y = np.array([[2, 3, 5],
[7, 11, 13]])
print(x + y)
# [[ 3 5 8]
# [ 8 13 16]]
广播数组会被创建吗?也就是说,以下数组会在操作之前
物理地
创建吗?
x
对于较小的数组,问题不太明显,但对于较大的数组,差异可能相当大。当隐式广播导致创建新数组时,重复相同的数字可能会浪费大量内存:
[[1, 2, 3],
[1, 2, 3]]
当广播数组
x = np.random.rand(10000)
y = np.random.rand(10000, 10000)
print(x + y)
实际
使用
创建时,内存浪费变得非常大。
x
如果发生这样的广播,有没有办法避免创建新的数组?如果不是(即未创建新数组),如何实现不匹配形状之间的二元运算?
If such broadcasting occurs, is there a way to avoid creating a new array? If not (i.e. a new array is not created), how are binary operations between mismatching shapes implemented?
NumPy 广播不复制数组
好消息是 NumPy 广播 不会 在内存中创建扩展数组的副本。这对于内存效率和性能至关重要,尤其是在处理大型数组时。
广播如何工作?
NumPy 利用其高效的视图机制来实现广播。它不会复制数据,而是创建数组的“视图”,这些视图具有修改后的步幅信息。步幅描述了在内存中从一个数组元素移动到下一个元素需要跳过的字节数。
在的示例中,当执行
x + y
时,NumPy 不会创建一个新的 10000x10000 数组来存储
x
的扩展版本。相反,它会创建一个具有修改后的步幅的视图,以便在执行加法运算时,它会重复使用
x
中的相同值。
避免创建新数组?
由于广播本身不会创建扩展数组的副本,因此无需采取任何特殊措施来避免内存浪费。NumPy 会自动为处理。
二进制运算的实现方式:
NumPy 使用迭代和索引操作的组合,以及其视图机制,在具有不匹配形状的数组之间执行二进制运算。它会根据广播规则有效地计算最终结果数组的每个元素,而无需创建任何不必要的中间数组。
总而言之,不必担心 NumPy 广播会创建大型中间数组。它是一种经过精心设计的内存效率机制,可以处理不同形状数组之间的运算。
标签:python,numpy,array-broadcasting,memory-efficient From: 78774337