Betrachten Sie die folgende Übung in Numpy Array Broadcasting.Numpy, Python: Abmessungen von Arrays automatisch beim Senden erweitern
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
Ich kenne die Numpy Regeln für den digitalen Rundfunk und ich bin vertraut mit bsxfun
Funktionalität in Matlab. Ich verstehe, warum der Versuch, ein (2,1) -Array in ein (2, N, N) -Array zu übertragen, fehlschlägt, und dass ich das (2,1) -Array vorher in ein (2,1,1) -Array umformen muss Sendung geht durch.
Meine Frage ist: Gibt es irgendeine Möglichkeit, Python zu sagen, die Dimensionalität eines Arrays automatisch zu paddern, wenn es versucht, zu übertragen, ohne dass ich ihm die notwendige Dimension spezifisch mitteilen muss?
ich will nicht explizit Paar den (2,1) Vektor mit dem mehrdimensionalen Array gegen werden, es wird ausgestrahlt --- sonst ich etwas dumm und absurd hässlich wie mult_v_A = lambda v,A: v.reshape([v.size] + [1]*(A.ndim-1)) * A
tun könnte. Ich weiß nicht vorher, ob das "A" -Array 2D oder 3D oder N-D sein wird.
Matlabs bsxfun
Broadcasting-Funktion füllt implizit die Dimensionen wie benötigt, also hoffe ich, dass ich etwas in Python machen kann.
Meine Ansicht ist, dass dies eine Funktion und kein Fehler ist. Nehmen wir beispielsweise an, Sie hätten einen 2-mal-1-Spaltenvektor "v" und dann hätten Sie ein 2-mal-2-mal-10 "ndarray". Möchten Sie 'v' umformen' (2,1,1) 'oder Form' (1,2,1) '? Wenn Sie nur die Dimensionen auffüllen, könnte dies für den Benutzer mehrdeutig sein. Das Erzwingen einer expliziten Umformung ist ein besseres allgemeines Verfahren und überlässt es dem Benutzer, eine spezielle Funktion zu schreiben, um die Umformung automatisch durchzuführen, wenn der Benutzer eine feste Konvention hat. Aber es ist nicht gut, einen globalen "numpigen" Dimensions-Padder zu machen, der eine Konvention auf dich drängt. Es wäre zu leicht zu missbrauchen. – ely
-1 @EMS. Diese Mehrdeutigkeit wird leicht gelöst, indem spezifiziert wird, dass die erste Nicht-Singleton-Dimension in der Übertragung verwendet wird. Diese Haltung von "So ist es besser" ist völlig ungeeignet für Systeme, die von professionellen Programmierern und angewandten Mathematikern verwendet werden - das ist ein Fehler in Bezug auf Unlesbarkeit und Vollständigkeit, kein Merkmal. –
-1 @Ahmed Fashih. Ich bin ein angewandter Mathematiker, der jeden Tag Python-Code für wissenschaftliche Anwendungen schreibt, und ich glaube, dass Ihre vorgeschlagene Konvention, immer die erste Nicht-Singleton-Dimension zu übernehmen, sehr schlecht wäre. Viel besser für Sie, eine Funktion zu schreiben, die diese Konvention annimmt, als für NumPy-Entwickler, die sich Gedanken darüber machen, eine Konvention wie die, die einigen Benutzern (wie Ihnen) Vorteile bringt, zu schreiben, aber für andere Benutzer (wie mich) nicht nützlich wäre. – ely