Czy można zastosować nadawanie numpy (z tablicami 1D),

x=np.arange(3)[:,np.newaxis]
y=np.arange(3)
x+y=
array([[0, 1, 2],
       [1, 2, 3],
       [2, 3, 4]])

Do matryc 3D podobnych do poniższego poniżej, tak że każdy element w [I] jest traktowany jako wektor 1D jak w powyższym przykładzie?

a=np.zeros((2,2,2))
a[0]=1
b=a
result=a+b

W wyniku

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]])
0
Alex 8 wrzesień 2017, 21:40

2 odpowiedzi

Najlepsza odpowiedź

Możesz to zrobić w taki sam sposób, jak w takim samym sposobie umieszczenia 1D, tj. Włóż nową oś między osią 0 a osią 1 w albo a lub 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.]])
3
Psidom 8 wrzesień 2017, 18:49

Ponieważ a i b są to samo kształt, powiedzmy (2,2,2), a+b rzeczywiście zadziała. Sposób, w jaki prace nadawcze jest to, że pasuje do wymiarów operandów w odwrotnej kolejności, począwszy od ostatniego wymiaru w górę (np. Biorąc pod uwagę kolumny przed wierszy w obudowie dwuwymiarowej). Jeśli wymówienie wymiarów, zostanie uwzględniony następny wymiar.

W przypadku, gdy wymiary nie pasują, a jeśli jeden z wymiarów jest 1, wówczas wymiar operand jest powtarzany w celu dopasowania do drugiego operanda (np. Jeśli {x1}} i b.shape = (2,2,2) Następnie wartości w Pierwszy wymiar a jest powtarzany, aby utworzyć kształt (2,2,2))

2
L_W 28 styczeń 2021, 07:09