2012-11-29 5 views
6

Ich möchte einfach eine numpy Array der Größe (N, m), die nur die erste Spalte aus Integer hat, und der Rest standardmäßig Float erstellen. Damit, auf Null, wenn initialisiert sollte es Ergebnisse:Wie man (einfach) eine Ganzzahl und float gemischte numpy Array

array([[ 0, 0., 0., 0., 0.], 
     [ 0, 0., 0., 0., 0.], 
     [ 0, 0., 0., 0., 0.], 
     [ 0, 0., 0., 0., 0.], 
     [ 0, 0., 0., 0., 0.]]) 

Alle Versuche, die ich gemacht haben Rückkehr mir einige Tupel Unterelemente, wenn sie versuchen, eine solche strukturierte Array zu erstellen.

+0

Aus Neugier, warum sollten Sie das brauchen? – Rambatino

+0

Stellen Sie sich vor, Sie müssen einige gemischte Daten speichern, wobei 1 Feld eine Ganzzahl ist (d. H. Ein diskretisierter Zustand) und die anderen real sind. – gluuke

+0

Aber was machst du mit diesen Daten? Wann ist 1! = 1.0 problematisch? – Rambatino

Antwort

13

Sie könnten ein Array mit dtype = object verwenden:

>>> arr = np.ndarray((10,4),dtype = object) 
>>> arr[:,0] = int(10) 
>>> arr[:,1:] = float(10) 
>>> arr 
array([[10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0]], dtype=object) 

Beachten Sie, dass Sie das richtige Verhalten bekommen, wenn Arithmetik zu tun.

>>> arr/3 
array([[3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333]], dtype=object) 

Oder Sie könnten ein numpy.recarray verwenden:

>>> import numpy as np 
>>> arr = np.recarray(10,dtype=[('x',int),('y',float,4)]) 
>>> arr[:] = 0 
>>> arr 
rec.array([(0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.])), 
      (0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.])), 
      (0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.])), 
      (0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.])), 
      (0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.]))], 
    dtype=[('x', '<i4'), ('y', '<f8', (4,))]) 
>>> arr['x'] 
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) 
>>> arr['y'] 
array([[ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.]]) 

Wenn Sie Arithmetik auf alle Werte tun müssen, werden Sie auf jedes Feld einzeln die Operation auszuführen, z.B.

>>> arr['x'] += 2 
>>> arr['y'] += 2 
0

Lesen dies in der numpy Dokumentation, die die homogene mehrdimensionales Array alle Mitglieder sein müssen vom gleichen Typ

NumPy Hauptobjekt anzeigt. Es ist eine Tabelle von Elementen (in der Regel Zahlen), alle vom selben Typ, indiziert von ein Tupel von positiven ganzen Zahlen.

2

Obwohl ich aus vielen Gründen denken kann, warum sollten Sie nicht tun dies in erster Linie sein wollen, dann ist es nicht für mich, um zu beurteilen, und ich hasse es, wenn Leute versuchen, den Wert meiner eigenen zu verringern schnelle und schlimme Hacks.

Die Begründung ist dtype=object zu verwenden. Da alles in Python ein Objekt ist, können Sie numerische Typen mischen, während Sie die Homogenität innerhalb eines Arrays beibehalten. Ich schlage folgendes vor, aber Sie können sich offensichtlich an Ihre Bedürfnisse anpassen:

import numpy 

rows = 5 
a = numpy.zeros((rows,5)).astype(object) 
a[:,0] = a[:,0].astype(int) 
print a 

[[0 0.0 0.0 0.0 0.0] 
[0 0.0 0.0 0.0 0.0] 
[0 0.0 0.0 0.0 0.0] 
[0 0.0 0.0 0.0 0.0] 
[0 0.0 0.0 0.0 0.0]] 
Verwandte Themen