问题
Is it possible to apply numpy broadcasting (with 1D arrays),
x=np.arange(3)[:,np.newaxis]
y=np.arange(3)
x+y=
array([[0, 1, 2],
[1, 2, 3],
[2, 3, 4]])
to 3d matricies similar to the one below, such that each element in a[i] is treated as a 1D vector like in the example above?
a=np.zeros((2,2,2))
a[0]=1
b=a
result=a+b
resulting in
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]])
回答1:
You can do this in the same way as if they are 1d array, i.e, insert a new axis between axis 0 and axis 1 in either a
or b
:
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.]])
回答2:
Since a
and b
are of same shape(2,2,2), a+b will indeed work.
The way broadcasting works is it matches the dimension of the operands, starting from the last dimension and goes up. If the dimension match then next dimension is considered.
In case the dimensions don't match AND if one of the dimension is 1
then that operand's dimension is repeated to match the other operand(for e.g. if a.shape=(2,1,2) and b.shape=(2,2,2) then values at 1st dimension of a is repeated to make the shape=(2,2,2))
来源:https://stackoverflow.com/questions/46122743/numpy-broadcasting-with-3d-arrays