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))

Другие вопросы по тегам