Ich fragte nach dtype
weil Ihr Beispiel rätselhaft ist.
I kann ein strukturiertes Array bilden mit 3 Elementen (1d) und 3 Felder:
In [1]: A = np.ones((3,), dtype='i,i,i')
In [2]: A
Out[2]:
array([(1, 1, 1), (1, 1, 1), (1, 1, 1)],
dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4')])
I nach Name ein Feld zugreifen kann (Hinzufügen von Klammern Dinge nicht ändert)
In [3]: A['f0'].shape
Out[3]: (3,)
aber wenn ich zwei Felder zugreifen, bekomme ich noch einen 1D-Array
In [4]: A[['f0','f1']].shape
Out[4]: (3,)
In [5]: A[['f0','f1']]
Out[5]:
array([(1, 1), (1, 1), (1, 1)],
dtype=[('f0', '<i4'), ('f1', '<i4')])
Eigentlich diese zusätzlichen Klammern keine Rolle, ob ich loo k bei Werten
In [22]: A['f0']
Out[22]: array([1, 1, 1], dtype=int32)
In [23]: A[['f0']]
Out[23]:
array([(1,), (1,), (1,)],
dtype=[('f0', '<i4')])
Wenn das Array eine einfache 2d ist, habe ich noch nicht bekommen, Ihre Formen
In [24]: A=np.ones((3,3),int)
In [25]: A[0].shape
Out[25]: (3,)
In [26]: A[[0]].shape
Out[26]: (1, 3)
In [27]: A[[0,1]].shape
Out[27]: (2, 3)
Aber was Frage zu machen, dass ein Array 2d, unabhängig davon, ob die Indizierung kehrt 1d oder 2, Ihre Funktion ist im Grunde ok
def reshape_to_vect(ar):
if len(ar.shape) == 1:
return ar.reshape(ar.shape[0],1)
return ar
Sie testen konnte ar.ndim
statt len(ar.shape)
. Aber so oder so ist es nicht teuer - das heißt, die Ausführungszeit ist minimal - keine großen Array-Operationen. reshape
kopiert keine Daten (es sei denn, Ihre Schritte sind seltsam), es sind also nur die Kosten für die Erstellung eines neuen Array-Objekts mit einem gemeinsamen Datenzeiger.
Sehen Sie sich den Code für np.atleast_2d
an; es testet für 0d und 1d. Im Fall 1d gibt es result = ary[newaxis,:]
zurück. Es fügt die zusätzliche Achse zuerst hinzu, die natürlichere numpy
Position zum Hinzufügen einer Achse. Sie fügen es am Ende hinzu.
ar.reshape(ar.shape[0],-1)
ist eine clevere Möglichkeit, den if
Test zu umgehen. Bei kleinen Timing-Tests geht es schneller, aber wir reden über Mikrosekunden, den Effekt einer Funktionsaufrufschicht.
np.column_stack
ist eine weitere Funktion, die bei Bedarf Spaltenarrays erstellt. Es verwendet:
if arr.ndim < 2:
arr = array(arr, copy=False, subok=True, ndmin=2).T
Was ist der 'dtype'? Sieht "strukturiert" aus. – hpaulj
Es ist irrelevant, ich habe das nur als ein Beispiel dafür verwendet, wie ich mit 1d oder 2d Array enden könnte. Meine Frage ist, wie man elegant 1d zu 2D-Array systematisch konvertiert. – DevShark