2013-04-04 17 views
25

Ich versuche, eine Spalte zu dem Array von recfromcsv erstellt hinzufügen. In diesem Fall ist es ein Array: [210,8] (Zeilen, Spalten).Wie Spalte zu numpy Array hinzufügen

Ich möchte eine neunte Spalte hinzufügen. Leer oder mit Nullen spielt keine Rolle.

from numpy import genfromtxt 
from numpy import recfromcsv 
import numpy as np 
import time 

if __name__ == '__main__': 
print("testing") 
my_data = recfromcsv('LIAB.ST.csv', delimiter='\t') 
array_size = my_data.size 
#my_data = np.append(my_data[:array_size],my_data[9:],0) 

new_col = np.sum(x,1).reshape((x.shape[0],1)) 
np.append(x,new_col,1) 
+1

Und was ist dies nicht funktioniert? –

+0

Die Sache, die nicht funktioniert, ist, dass es mir nicht die richtigen Dimensionen gibt, egal welche Version ich versuche. – user2130951

Antwort

49

ich denke, dass Ihr Problem ist, dass Sie np.append erwarten, dass die Spalte in-place hinzufügen, aber was es tut, weil, wie numpy Daten gespeichert sind, ist eine Kopie der verbundenen Arrays erstellen

Returns 
------- 
append : ndarray 
    A copy of `arr` with `values` appended to `axis`. Note that `append` 
    does not occur in-place: a new array is allocated and filled. If 
    `axis` is None, `out` is a flattened array. 

so müssen Sie die Ausgabe all_data = np.append(...) speichern:

my_data = np.random.random((210,8)) #recfromcsv('LIAB.ST.csv', delimiter='\t') 
new_col = my_data.sum(1)[...,None] # None keeps (n, 1) shape 
new_col.shape 
#(210,1) 
all_data = np.append(my_data, new_col, 1) 
all_data.shape 
#(210,9) 

Alternative Wege:

all_data = np.hstack((my_data, new_col)) 
#or 
all_data = np.concatenate((my_data, new_col), 1) 

Ich glaube, dass der einzige Unterschied zwischen diesen drei Funktionen (sowie np.vstack) sind ihr Standardverhalten für, wenn axis nicht angegeben ist:

  • concatenate annimmt axis = 0
  • hstack annimmt axis = 1 es sei denn Eingänge 1d, dann axis = 0
  • vstack annimmt axis = 0 nachdem eine Achse Zugabe, wenn die Eingänge 1d
  • append flacht Array

Basierend auf Dein Kommentar, und wenn du dir deinen Beispielcode näher ansiehst, glaube ich jetzt, dass du das a ist wahrscheinlich auf der Suche ist zu tun, um ein Feld zu einem record array hinzuzufügen. Sie importiert sowohl genfromtxt, die eine structured array und recfromcsv gibt, die die auf subtile Weise anders record array (recarray) zurückgibt. Sie verwendet recfromcsv so jetzt my_data ist eigentlich eine recarray, was bedeutet, dass wahrscheinlich my_data.shape = (210,) seit Rekarrays sind 1d Arrays von Datensätzen, wobei jeder Datensatz ein Tupel mit dem angegebenen dtype ist.

So könnte man dies versuchen:

import numpy as np 
from numpy.lib.recfunctions import append_fields 
x = np.random.random(10) 
y = np.random.random(10) 
z = np.random.random(10) 
data = np.array(list(zip(x,y,z)), dtype=[('x',float),('y',float),('z',float)]) 
data = np.recarray(data.shape, data.dtype, buf=data) 
data.shape 
#(10,) 
tot = data['x'] + data['y'] + data['z'] # sum(axis=1) won't work on recarray 
tot.shape 
#(10,) 
all_data = append_fields(data, 'total', tot, usemask=False) 
all_data 
#array([(0.4374783740738456 , 0.04307289878861764, 0.021176067323686598, 0.5017273401861498), 
#  (0.07622262416466963, 0.3962146058689695 , 0.27912715826653534 , 0.7515643883001745), 
#  (0.30878532523061153, 0.8553768789387086 , 0.9577415585116588 , 2.121903762680979), 
#  (0.5288343561208022 , 0.17048864443625933, 0.07915689716226904 , 0.7784798977193306), 
#  (0.8804269791375121 , 0.45517504750917714, 0.1601389248542675 , 1.4957409515009568), 
#  (0.9556552723429782 , 0.8884504475901043 , 0.6412854758843308 , 2.4853911958174133), 
#  (0.0227638618687922 , 0.9295332854783015 , 0.3234597575660103 , 1.275756904913104), 
#  (0.684075052174589 , 0.6654774682866273 , 0.5246593820025259 , 1.8742119024637423), 
#  (0.9841793718333871 , 0.5813955915551511 , 0.39577520705133684 , 1.961350170439875), 
#  (0.9889343795296571 , 0.22830104497714432, 0.20011292764078448 , 1.4173483521475858)], 
#  dtype=[('x', '<f8'), ('y', '<f8'), ('z', '<f8'), ('total', '<f8')]) 
all_data.shape 
#(10,) 
all_data.dtype.names 
#('x', 'y', 'z', 'total') 
+0

Abrufen der Datei "d: \ python27 \ lib \ Site-Pakete \ numpy \ core \ _methods.py", Zeile 18, in _sum out = out, keepdims = keepdims) TypeError: kann nicht mit flexiblem Typ reduziert werden – user2130951

+0

@ user2130951 Was ist der 'dtype' Ihres Arrays? 'my_data.dtype' – askewchan

+0

@ user2130951 Sind Sie sicher, dass Sie kein _field_ hinzufügen möchten? – askewchan

5

Wenn Sie einen Array haben, a von sagen 210 Zeilen von 8 Spalten:

a = numpy.empty([210,8]) 

und will eine neunte Spalte von Nullen hinzufügen, die Sie dies tun können:

b = numpy.append(a,numpy.zeros([len(a),1]),1) 
+2

Dies generiert Rückkehr verketten ((arr, Werte), Achse = Achse) ValueError: alle Eingabearrays müssen die gleiche Anzahl von Dimensionen haben – user2130951

+0

hmmmm. Einfach doppelt überprüft. Es funktioniert für mich (mit IDLE - Python Version 2.7) – atomh33ls

+0

Vielleicht liegt es daran, dass, wie von @askewchan vorgeschlagen, Sie tatsächlich eine Rückerstattung haben? Ich denke, das würde funktionieren, wenn Sie 'numpy.genfromtxt' oder' numpy.loadtxt' importieren würden? – atomh33ls

1

ich fügen Sie eine neue Spalte mit Einsen zu einer Matrix-Array auf diese Weise:

Z = append([[1 for _ in range(0,len(Z))]], Z.T,0).T 

Vielleicht ist es nicht so leistungsfähig?

+1

Verwenden Sie dieses Listenverständnis nicht, verwenden Sie ['np.ones'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.ones.html) oder [' np.ones_like'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.ones_like.html): 'append ([np.ones_like (Z)], ZT, 0) .T' – askewchan

Verwandte Themen