我不明白broadcasting。该文件解释了广播规则,但似乎没有用英语定义。我的猜测是广播是当NumPy用虚拟数据填充较小的维数组以执行操作时。但这不起作用:
>>> x = np.array([1,3,5])
>>> y = np.array([2,4])
>>> x+y
*** ValueError: operands could not be broadcast together with shapes (3,) (2,)
错误消息暗示我在正确的轨道上。有人可以定义广播,然后提供一些简单的示例,说明它何时起作用?何时不起作用?
答案 0 :(得分:1)
当你告诉它在不同尺寸的阵列上执行操作时,广播很难实现聪明。例如:
$user = (new User)->find(123); //123 is the PK of the User
在这里,它决定要在较高维数组(1-D)中的每个项目上使用较低维数组(0-D)应用该操作。
您还可以将二维数组(标量)或一维数组添加到二维数组中。在第一种情况下,您只需像以前一样将标量添加到二维数组中的所有项目。在第二种情况下,numpy将逐行添加:
2 + np.array([1,3,5]) == np.array([3, 5, 7])
有很多方法可以告诉numpy沿着不同的轴应用操作。在3-D阵列和1-D,2-D或0-D阵列之间应用操作时,可以进一步采取这种方法。
答案 1 :(得分:1)
术语广播描述了numpy如何在算术运算期间处理具有不同形状的数组。
基本上,numpy可以通过数组扩展操作域。
广播的唯一要求是对齐数组维度,以便:
所以,例如if:
x = np.ndarray(shape=(4,1,3))
y = np.ndarray(shape=(3,3))
你不能像这样对齐x和y:
4 x 1 x 3
3 x 3
但你可以这样:
4 x 1 x 3
3 x 3
假设我们有:
x = np.ndarray(shape=(1,3), buffer=np.array([1,2,3]),dtype='int')
array([[1, 2, 3]])
y = np.ndarray(shape=(3,3), buffer=np.array([1,1,1,1,1,1,1,1,1]),dtype='int')
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
操作x + y
将导致:
array([[2, 3, 4],
[2, 3, 4],
[2, 3, 4]])
我希望你抓住了漂移。如果没有,您可以随时查看官方文档here。
干杯!
答案 2 :(得分:1)
1。什么是广播? 广播是张量操作。对神经网络(ML,AI)有用
2。广播的用途是什么?
不支持广播,仅添加相同的Dimension(形状)张量。
广播为我们提供了添加两个不同维度的张量的灵活性。
运行Python示例代码了解概念
x = np.array([1,3,5,6,7,8])
y = np.array([2,4,5])
X=x.reshape(2,3)
调整x的形状以得到形状为(2,3)的2D张量X,然后将此2D张量X与形状为(1,3)的1D张量y相加以获得形状为(2,3)的2D张量z
print("X =",X)
print("\n y =",y)
z=X+y
print("X + y =",z)
对于较小的张量几乎是正确的,没有歧义,较小的张量将被广播以匹配较大的张量的形状。(小向量被重复但没有填充虚拟数据或零匹配较大的形状)。
3。广播如何发生? 广播包括两个步骤:
1将广播轴添加到较小的张量以匹配的ndim 大张量。
2在这些新轴旁边重复较小的张量以匹配完整形状 大张量。
4。为什么您的代码中没有广播? 您的代码正常工作,但此处无法进行广播,因为两个张量的形状不同,但Dimensional(1D)相同。 尺寸不相同时会发生广播。 您需要做的是更改张量之一的尺寸,您将体验广播。
5。深入了解。 广播(较小张量的重复)沿广播轴发生,但是由于两个张量都是一维的,因此没有广播轴。 不要将张量维与张量的形状混淆, 张量维度与矩阵维度不同。
答案 3 :(得分:0)
>>> x = np.array([1,3,5])
>>> y = np.array([2,4])
>>> x+y
*** ValueError: operands could not be broadcast together with shapes (3,) (2,)
广播是numpy如何对具有不同形状的数组进行数学运算。形状是数组具有的格式,例如,您使用的数组x具有3个1维元素。 y有2个元素和1个维度。
要执行广播,有2条规则: 1)数组具有相同的尺寸(形状)或 2)不匹配的维度等于1。
例如x具有shape(2,3)[或2行3列]; y的形状为(2,1)[或2行1列]
您可以添加它们吗? x + y? 回答:是的,因为不匹配的尺寸等于1(y中的列)。如果y具有shape(2,4),则将无法进行广播,因为不匹配的尺寸不是1。
如果您发布了: 操作数不能与形状(3,)(2,)一起广播; 这是因为3个和2个完全不匹配都只有1行。
答案 4 :(得分:0)
我建议尝试使用np.broadcast_arrays,运行一些演示可能会给出直观的想法。 Official Document也很有帮助。根据我目前的理解,numpy将比较从尾到头的尺寸。如果1个dim为1,它将在维度上广播,如果一个数组具有更多轴,例如(256 * 256 * 3)乘以(1,),则可以将(1)视为(1,1,1)。广播将产生(256,256,3)。