prawdopodobnie najczystszym sposobem jest użycie np.repeat
:
a = np.array([[1, 2], [1, 2]])
print(a.shape)
# (2, 2)
# indexing with np.newaxis inserts a new 3rd dimension, which we then repeat the
# array along, (you can achieve the same effect by indexing with None, see below)
b = np.repeat(a[:, :, np.newaxis], 3, axis=2)
print(b.shape)
# (2, 2, 3)
print(b[:, :, 0])
# [[1 2]
# [1 2]]
print(b[:, :, 1])
# [[1 2]
# [1 2]]
print(b[:, :, 2])
# [[1 2]
# [1 2]]
Mimo, że często można uniknąć powtarzania swoich tablic łącznie za pomocą broadcasting. Na przykład, powiedzmy, że chciałem dodać (3,)
wektor:
c = np.array([1, 2, 3])
do a
. Mogłem skopiować trzy razy zawartość trzeciego wymiaru, a następnie skopiować zawartość c
dwa razy w pierwszym i drugim wymiarze, tak aby obie moje macierze były (2, 2, 3)
, a następnie obliczyć ich sumę. Jednakże, jest to o wiele prostsze i szybsze, aby to zrobić:
d = a[..., None] + c[None, None, :]
Tutaj a[..., None]
ma kształt (2, 2, 1)
i c[None, None, :]
ma kształt (1, 1, 3)
*. Kiedy obliczyć sumę, wynik staje się „nadawać” wzdłuż wymiarów wielkości 1, dając mi wyniku kształtu (2, 2, 3)
:
print(d.shape)
# (2, 2, 3)
print(d[..., 0]) # a + c[0]
# [[2 3]
# [2 3]]
print(d[..., 1]) # a + c[1]
# [[3 4]
# [3 4]]
print(d[..., 2]) # a + c[2]
# [[4 5]
# [4 5]]
Broadcasting jest bardzo potężna technika, ponieważ unika się dodatkowego narzutu związanego w tworzeniu powtórzone kopie twoich tablic wejściowych w pamięci.
* Chociaż wliczone ich jasności, None
indeksy język c
nie są rzeczywiście konieczne - można również zrobić a[..., None] + c
, czyli nadawać (2, 2, 1)
tablicę przeciwko (3,)
tablicy. Wynika to z tego, że jeśli jedna z macierzy ma mniejszą liczbę wymiarów niż druga, to tylko wymiary z obu macierzy muszą być zgodne. Aby podać bardziej skomplikowany przykład:
a = np.ones((6, 1, 4, 3, 1)) # 6 x 1 x 4 x 3 x 1
b = np.ones((5, 1, 3, 2)) # 5 x 1 x 3 x 2
result = a + b # 6 x 5 x 4 x 3 x 2
celu sprawdzenia, czy rzeczywiście daje prawo wynik, można również wydrukować 'b [:,:, 0] ',' b [:,:, 1] 'i' b [:,:, 2] '. Każdy trzeci wycinek wymiaru jest kopią oryginalnej tablicy 2D. To nie jest tak oczywiste, patrząc na "print (b)". – ely
To jest świetna odpowiedź !! Dziękuję Ci! – drg