NumPy вещание с 3D-массивами
Можно ли применить цифровую трансляцию (с 1D массивами),
x=np.arange(3)[:,np.newaxis]
y=np.arange(3)
x+y=
array([[0, 1, 2],
[1, 2, 3],
[2, 3, 4]])
в 3d-матрицы, аналогичные приведенным ниже, так что каждый элемент в [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]])
1 ответ
Вы можете сделать это так же, как если бы они были массивом 1d, т.е. вставить новую ось между осью 0 и осью 1 либо a
или же 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.]])
Поскольку a
а также b
имеют одинаковую форму (2,2,2), a+b действительно будет работать. Принцип работы широковещательной передачи заключается в том, что она соответствует размерности операндов, начиная с последнего измерения и идет вверх. Если размер совпадает, то рассматривается следующий размер.
В случае, если размеры не совпадают, И если один из размеров 1
затем размер этого операнда повторяется для соответствия другому операнду (например, если a.shape=(2,1,2) и b.shape=(2,2,2), то значения в 1-м измерении a повторяются, чтобы сделать shape=(2,2,2))