2016-09-16 3 views
0

Angenommen, ich habe ein Numpy-Array mit den Dimensionen nx1 (n Zeilen, 1 Spalte). Meine Nutzung dieser ist für die Umsetzung 3D-Vektoren als 3x1 Matrizen mit Numpy, aber die Anwendung kann für nx1 Vector Matrices erweitert werden:Python Numpy - Elemente eines Vektor-Numpy-Arrays als numerische Werte statt als Numpy-Arrays lesen

In [0]: import numpy as np 

In [1]: foo = np.array([ ['a11'], ['a21'], ['a31'], ..., ['an1'] ]) 

Ich möchte die Werte des Arrays können zugreifen, indem ein Wert dereferencing.

In [2]: foo[0] 
Out[2]: 'a11' 

In [3]: foo[n] 
Out[3]: 'an1' 

jedoch durch die allgemeine Formatierung von Numpy Arrays, ein Vektor-Array wäre ein 2D-Array in Betracht gezogen werden und 2 Werte zu dereferenzieren es erfordern würde: Ich würde foo[0][0] oder foo[0][n] verwenden, um die gleichen Werte zu erhalten. Ich konnte np.transpose verwende den Vektor in eine Reihe zu transponieren, aber die Syntax weiterhin einen 2D Numpy Array zu erzeugen, die zwei Werte zu dereferenzieren erfordern: daher

In [4]: np.transpose(foo)[0] == foo[0][0] 
Out[4]: array([ True, False, False], dtype=bool) 

In [5]: np.transpose(foo)[0][0] == foo[0][0] 
Out[5]: True 

Dies würde einen Vorteil zunichte machen, das würde die Umsetzung. Wie kann ich auf die Elemente eines Vector Numpy Array mit nur einem Dereferenzierungswert zugreifen?

+0

Sie können 'foo = np.array (['a11', 'a21', 'a31', ..., 'an1'])' 'schreiben. Dann 'foo [0]' ''a11''. Numpy hat echte * n * -dimensionale Arrays, und * n * kann 1 sein. –

+1

Auch im 2-d-Fall können Sie 'foo [0,0]' schreiben. –

+0

Ich mag den zweiten Vorschlag, den Sie gemacht haben, aber der erste nimmt die ursprüngliche Formatierung von Vektormatrizen, da ich sie in Matrix Multiplication verwenden werde. Ich nehme an, dass ich immer 1D-Arrays transponieren kann, wenn ich diese Mux-Operationen ausführe, aber es scheint nicht ansprechend zu sein, solche Transpositionen zu machen. –

Antwort

0

könnten Sie verwenden die numpy.ndarray.tolist() Funktion:

In [1]: foo = np.array([ ['a11'], ['a21'], ['a31'] ]) 
In [2]: foo.tolist() 
Out[2]: [['an1'], ['a2n'], ['a3n']] 

In [3]: foo.tolist()[0] 
Out[3]: ['an1'] 
0

Ihr foo ist ein 2D-Array von Strings:

In [354]: foo = np.array([ ['a11'], ['a21'], ['a31'], ['an1'] ]) 
In [355]: foo.shape 
Out[355]: (4, 1) 
In [356]: foo[0] # selects a 'row' 
Out[356]: 
array(['a11'], 
     dtype='<U3') 
In [357]: foo[0,:] # or more explicitly with the column : 
Out[357]: 
array(['a11'], 
     dtype='<U3') 
In [358]: foo[:,0]  # selects a column, results in a 1d array 
Out[358]: 
array(['a11', 'a21', 'a31', 'an1'], 
     dtype='<U3') 
In [359]: foo[0,0]  # select an element 
Out[359]: 'a11' 

Transponieren ist noch 2d, nur Schalt Zeilen und Spalten:

In [360]: foo.T 
Out[360]: 
array([['a11', 'a21', 'a31', 'an1']], 
     dtype='<U3') 
In [361]: _.shape 
Out[361]: (1, 4)  

Ravel (oder flatten) verwandelt es in ein 1d-Array, auf das zugegriffen werden kann mit nur einem Index.

In [362]: foo.ravel()[1] 
Out[362]: 'a21' 

Ihr Vortrag über Matrixmultiplikation und so lässt vermuten, dass Ihr Array wirklich nicht von Strings ist, aber das ‚a21‘ ein Array darstellt, oder ist die Nummer. Also ist es wirklich ein zweidimensionales Array oder vielleicht ein 3D-Array?

Verwandte Themen