Rozważ następujące ćwiczenie w nadawaniu tablicy Numpy.Numpy, python: automatyczne rozszerzanie wymiarów tablic podczas emisji
import numpy as np
v = np.array([[1.0, 2.0]]).T # column array
A2 = np.random.randn(2,10) # 2D array
A3 = np.random.randn(2,10,10) # 3D
v * A2 # works great
# causes error:
v * A3 # error
Znam zasady NumPy nadawczych i jestem zaznajomiony z bsxfun
funkcjonalność w Matlab. Rozumiem, dlaczego próba nadania tablicy (2,1) do tablicy (2, N, N) kończy się niepowodzeniem, i że muszę przekształcić tablicę (2,1) w tablicę (2,1,1) przed tym nadawanie przechodzi.
Moje pytanie brzmi: czy jest jakiś sposób, aby powiedzieć Pythonowi, aby automatycznie podkładał wymiarowość tablicy podczas próby emisji, bez konieczności wyraźnego wymawiania jej koniecznego wymiaru?
I nie chce jednoznacznie para The (2,1) wektor z wielowymiarowej tablicy to będzie transmitowane na --- inaczej mógłby zrobić coś głupiego i absurdalnie brzydki jak mult_v_A = lambda v,A: v.reshape([v.size] + [1]*(A.ndim-1)) * A
. Nie wiem z góry, czy tablica "A" będzie 2D, 3D czy N-D.
Funkcja nadawania Matlab'a bsxfun
niejawnie podkłada wymiary w razie potrzeby, więc mam nadzieję, że jest coś, co mógłbym zrobić w Pythonie.
Mój pogląd jest taki, że jest to funkcja, a nie błąd. Załóżmy na przykład, że masz wektor kolumnowy "v" 2 na 1, a potem masz "ndarray" 2 na 2 na 10. Czy chcesz przekształcić 'v', aby miał kształt' (2,1,1) 'lub kształt' (1,2,1) '? Jeśli po prostu podmienisz wymiary, może to być niejednoznaczne dla użytkownika. Wymuszenie wyraźnej zmiany kształtu jest lepszą ogólną procedurą i pozostawienie użytkownikowi funkcji specjalnej do automatycznego przekształcania, jeśli użytkownik ma ustaloną konwencję. Ale nie jest dobrze tworzyć globalny "numpy", który wymusza na tobie konwencję. Zbyt łatwo byłoby nadużywać. – ely
-1 @EMS. Ta niejednoznaczność jest łatwo rozwiązana przez określenie, że pierwszy wymiar nie-singletonowy będzie używany w transmisji. Taka postawa "w ten sposób jest lepsza" jest całkowicie nieodpowiednia dla systemów używanych przez profesjonalnych programistów i matematyków stosowanych --- jest to wada pod względem nieczytelności i complectedness, a nie cechą. –
-1 @Ahmed Fasih. Jestem matematykiem stosującym się do codziennego pisania kodu Pythona do zastosowań naukowych i uważam, że proponowana przez ciebie konwencja zawsze przyjmująca pierwszy wymiar nie singletonowy byłaby bardzo słaba. Znacznie lepiej jest napisać funkcję, która przyjmuje tę konwencję niż dla programistów NumPy, aby martwić się o kodowanie konwencji takiej, która przynosi korzyści niektórym użytkownikom (takim jak Ty), ale nie byłaby przydatna dla niektórych innych użytkowników (takich jak ja). – ely