假设我在python中有这两段代码:
1 --------------------------
import numpy as np
x = np.array([1,2,3,4])
y = x
x = x + np.array([1,1,1,1])
print y
2 --------------------------
import numpy as np
x = np.array([1,2,3,4])
y = x
x += np.array([1,1,1,1])
print y
Run Code Online (Sandbox Code Playgroud)
我认为y两个例子中的结果都是相同的,因为y指出x并x成为(2,3,4,5),但事实并非如此
结果是(1,2,3,4) for 1和(2,3,4,5) for 2.
经过一些研究,我发现在第一个例子中
#-First example---------------------------------------
x = np.array([1,2,3,4]) # create x --> [1,2,3,4]
y = x # made y point to x …Run Code Online (Sandbox Code Playgroud) 术语广播描述了numpy如何在算术运算期间处理具有不同形状的数组.
Example 1:
from numpy import array
a = array([1.0,2.0,3.0])
b = array([2.0,2.0,2.0]) # multiply element-by-element ()
a * b
>> array([ 2., 4., 6.])
Example 2 :
from numpy import array
a = array([1.0,2.0,3.0])
b = 2.0 # broadcast b to all a
a * b
>>array([ 2., 4., 6.])
Run Code Online (Sandbox Code Playgroud)
我们可以将在算术运算期间被拉伸的标量b想象成具有与a相同形状的数组.Numpy足够聪明,可以使用原始标量值,而无需实际制作副本,以便广播操作尽可能具有内存和计算效率(b是标量,而不是数组)
@Eric Duminil在另一个内存性能问题中做出的一个小基准测试表明,广播在速度和内存方面存在差异
但是,我引用上面链接的同一篇文章:
有些情况下,广播是一个坏主意,因为它会导致内存的低效使用,从而减慢计算速度
问题是:当广播使用不必要的大量内存并导致性能低下时?换句话说,当我们应该使用混合广播/python循环算法而不是纯粹的广播approch?