带有 3d 数组的 numpy 广播
numpy broadcasting with 3d arrays
是否可以应用 numpy 广播(使用一维数组),
x=np.arange(3)[:,np.newaxis]
y=np.arange(3)
x+y=
array([[0, 1, 2],
[1, 2, 3],
[2, 3, 4]])
到类似于下面的 3d 矩阵,这样 a[i] 中的每个元素都像上面的例子一样被视为一维向量?
a=np.zeros((2,2,2))
a[0]=1
b=a
result=a+b
导致
result[0,0]=array([[2, 2],
[2, 2]])
result[0,1]=array([[1, 1],
[1, 1]])
result[1,0]=array([[1, 1],
[1, 1]])
result[1,1]=array([[0, 0],
[0, 0]])
您可以按照与一维数组相同的方式执行此操作,即在 a
或 b
中的轴 0 和轴 1 之间插入一个新轴:
a + b[:,None] # or a[:,None] + b
(a + b[:,None])[0,0]
#array([[ 2., 2.],
# [ 2., 2.]])
(a + b[:,None])[0,1]
#array([[ 1., 1.],
# [ 1., 1.]])
(a + b[:,None])[1,0]
#array([[ 1., 1.],
# [ 1., 1.]])
(a + b[:,None])[1,1]
#array([[ 0., 0.],
# [ 0., 0.]])
由于a
和b
的形状相同,所以说(2,2,2)
,a+b
确实可以。
广播的工作方式是它以相反的顺序匹配操作数的维度,从最后一个维度开始向上(例如,在二维情况下考虑列在行之前)。如果维度匹配,则考虑下一个维度。
如果维度不匹配且其中一个维度是 1
,则重复该操作数的维度以匹配另一个操作数(例如,如果 a.shape = (2,1,2)
和 b.shape = (2,2,2)
然后重复 a
第一维的值以形成形状 (2,2,2)
)
是否可以应用 numpy 广播(使用一维数组),
x=np.arange(3)[:,np.newaxis]
y=np.arange(3)
x+y=
array([[0, 1, 2],
[1, 2, 3],
[2, 3, 4]])
到类似于下面的 3d 矩阵,这样 a[i] 中的每个元素都像上面的例子一样被视为一维向量?
a=np.zeros((2,2,2))
a[0]=1
b=a
result=a+b
导致
result[0,0]=array([[2, 2],
[2, 2]])
result[0,1]=array([[1, 1],
[1, 1]])
result[1,0]=array([[1, 1],
[1, 1]])
result[1,1]=array([[0, 0],
[0, 0]])
您可以按照与一维数组相同的方式执行此操作,即在 a
或 b
中的轴 0 和轴 1 之间插入一个新轴:
a + b[:,None] # or a[:,None] + b
(a + b[:,None])[0,0]
#array([[ 2., 2.],
# [ 2., 2.]])
(a + b[:,None])[0,1]
#array([[ 1., 1.],
# [ 1., 1.]])
(a + b[:,None])[1,0]
#array([[ 1., 1.],
# [ 1., 1.]])
(a + b[:,None])[1,1]
#array([[ 0., 0.],
# [ 0., 0.]])
由于a
和b
的形状相同,所以说(2,2,2)
,a+b
确实可以。
广播的工作方式是它以相反的顺序匹配操作数的维度,从最后一个维度开始向上(例如,在二维情况下考虑列在行之前)。如果维度匹配,则考虑下一个维度。
如果维度不匹配且其中一个维度是 1
,则重复该操作数的维度以匹配另一个操作数(例如,如果 a.shape = (2,1,2)
和 b.shape = (2,2,2)
然后重复 a
第一维的值以形成形状 (2,2,2)
)