2016-08-15 10 views
2

Lets sagen, ich habe drei Vektoren a, b und c:Wie erstellt man eine numpige Matrix mit unterschiedlichen Spaltendatentypen?

a = np.array([1,2,3]) 
b = np.array([1.2, 3.2, 4.5]) 
c = np.array([True, True, False]) 

Was ist der einfachste Weg, dies in eine Matrix drehen d unterschiedlichen Datentypen und Spaltenbeschriftungen, die als solche:

d = ([[1, 1.2, True], 
    [2, 3.2, True], 
    [3, 4.5, False]], 
    dtype=[('aVals','i8'), ('bVals','f4'), ('cVals','bool')]) 

So dass ich dann diese Matrix in eine .npy Datei speichern und auf die Daten als solche nach dem Öffnen zugreifen kann;

>>> d = np.load('dFile') 
>>> d['aVals'] 
np.array([1,2,3], dtype = [('aVals', '<i8)]) 

Ich habe eine CIMple verwendet column_stack die Matrix zu erstellen, aber ich Kopfschmerzen bekommen, um herauszufinden, wie die Datentypen und Spaltennamen enthalten, da column_stack akzeptiert keine dtype Argument, und ich kann‘ t Einen Weg finden, Feldnamen und Datentypen hinzuzufügen, nachdem die column_stack durchgeführt wurde. Es ist erwähnenswert, dass die Vektoren a, b und c keine expliziten Datentypen haben, die bei ihrer Erstellung deklariert wurden, sie sind wie oben gezeigt.

+0

By the way, wenn Sie einfach tun, sind dies die Arrays zu speichern, könnten Sie 'np.savez (outfile, Avale = a, bVals = b, cVals = c) 'um alle drei Arrays in einer komprimierten npz-Datei zu speichern. – unutbu

Antwort

3

Es gibt eine wenig bekannte recarray Funktion, die Arrays wie diese konstruiert. Es wurde kürzlich in einer SO Frage zitiert:

Assigning field names to numpy array in Python 2.7.3

erlaubt es alles aus den Eingabefeldern abzuleiten:

In [19]: np.rec.fromarrays([a,b,c]) 
Out[19]: 
rec.array([(1, 1.2, True), (2, 3.2, True), (3, 4.5, False)], 
      dtype=[('f0', '<i4'), ('f1', '<f8'), ('f2', '?')]) 

Angeben Namen

In [26]: d=np.rec.fromarrays([a,b,c],names=['avals','bvals','cVals']) 
In [27]: d 
Out[27]: 
rec.array([(1, 1.2, True), 
      (2, 3.2, True), 
      (3, 4.5, False)], 
      dtype=[('avals', '<i4'), ('bvals', '<f8'), ('cVals', '?')]) 
In [28]: d['cVals'] 
Out[28]: array([ True, True, False], dtype=bool) 

Nach dem Erstellen des Ziel Array von richtige Größe und dtype es macht eine Feld für Feld Kopie. Dies ist typisch für die rec.recfunctions (sogar astype tut dies).

# populate the record array (makes a copy) 
for i in range(len(arrayList)): 
    _array[_names[i]] = arrayList[i] 

A 2011 Referenz: How to make a Structured Array from multiple simple array

+0

zu hpaulj Kommentar hinzufügen gibt es einen anderen einfachen Weg .... von numpy.lib._iotools Import easy_dtype als einfach ... easy ((int, float, float), Namen = "a, b, c") .. . ergibt einen dtyp von .... dtype ([('a', '

+0

'easy_dtype' wird von 'genfromtxt' verwendet, um den' dtype' Parameter in den formelleren 'dtype' zu ​​übersetzen. 'fromarrays' verwendet' np.rec.format_parser' um diese Übersetzung zu machen. – hpaulj

+0

Danke, das ist perfekt und sehr einfach – Anonymous

3
d = np.empty(len(a), dtype=[('aVals',a.dtype), ('bVals',b.dtype), ('cVals',c.dtype)]) 
d['aVals'] = a 
d['bVals'] = b 
d['cVals'] = c 

als wiederverwendbare Funktion:

def column_stack_overflow(**kwargs): 
    dtype = [(name, val.dtype) for name, val in kwargs.items()] 
    arr = np.empty(len(kwargs.values()[0]), dtype=dtype) 
    for name, val in kwargs.items(): 
     arr[name] = val 
    return arr 

Dann:

column_stack_overflow(aVals=a, bVals=b, cVals=c) 

Aber beachten kwargs ist ein dict so ungeordnet, so dass man sie nicht bekommen können Sie die Spalten in der Reihenfolge passieren .

Verwandte Themen