Comment ajouter une colonne au tableau numpy
J'essaie d'ajouter une colonne au tableau créé à partir de recfromcsv
. Dans ce cas, c'est un tableau: [210,8]
(lignes, colonnes).
Je veux ajouter une neuvième colonne. Vide ou avec des zéros n'a pas d'importance.
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)
3 réponses
Je pense que votre problème est que vous attendez que np.append
ajoute la colonne sur place, mais ce qu'il fait, en raison de la façon dont les données numpy sont stockées, est de créer une copie des tableaux joints
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.
Vous devez donc enregistrer la sortie all_data = np.append(...)
:
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)
Autres moyens:
all_data = np.hstack((my_data, new_col))
#or
all_data = np.concatenate((my_data, new_col), 1)
Je crois que la seule différence entre ces trois fonctions (ainsi que np.vstack
) sont leurs comportements par défaut lorsque axis
est non spécifié:
-
concatenate
supposeaxis = 0
-
hstack
supposeaxis = 1
sauf si les entrées sont 1d, alorsaxis = 0
-
vstack
supposeaxis = 0
après avoir ajouté un axe si les entrées sont 1d -
append
aplatit le tableau
Sur la base de votre commentaire, et en regardant de plus près votre exemple de code, je crois maintenant que ce que vous cherchez probablement à faire est d'ajouter un champ à un tableau d'enregistrements. Vous avez importé les deux genfromtxt
qui retourne un structuré tableau et recfromcsv
qui renvoie l'subtilement différentes tableau d'enregistrements (recarray
). Vous avez utilisé le {[17] } donc maintenant my_data
est en fait un recarray
, ce qui signifie que très probablement my_data.shape = (210,)
puisque les recarrays sont des tableaux 1d d'enregistrements, où chaque enregistrement est un tuple avec le dtype donné.
, Donc vous pouvez essayer ceci:
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')
Si vous avez un tableau, a
de dire 210 lignes par 8 colonnes:
a = numpy.empty([210,8])
Et si vous voulez ajouter une neuvième colonne de zéros, vous pouvez le faire:
b = numpy.append(a,numpy.zeros([len(a),1]),1)
J'ajoute une nouvelle colonne avec ceux à un tableau matriciel de cette façon:
Z = append([[1 for _ in range(0,len(Z))]], Z.T,0).T
Peut-être que ce n'est pas efficace?