web-dev-qa-db-fra.com

Comment ajouter une colonne à un 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 __== '__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)
37
user2130951

Je pense que votre problème est que vous vous attendez à ce que np.append Ajoute la colonne sur place, mais sa fonction, 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)

Manières alternatives:

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) Réside dans leurs comportements par défaut lorsque axis n'est pas spécifié:

  • concatenate suppose que axis = 0
  • hstack suppose que axis = 1 sauf si les entrées sont 1d, alors axis = 0
  • vstack suppose axis = 0 après l'ajout d'un axe si les entrées sont 1d
  • append aplatit un tableau

Sur la base de votre commentaire et en examinant de plus près votre exemple de code, je pense maintenant que ce que vous cherchez probablement à faire est d’ajouter un champ à un - tableau d'enregistrement . Vous avez importé à la fois genfromtxt qui retourne un tableau structuré et recfromcsv qui renvoie subtilement différent tableau d'enregistrement (recarray) . Vous avez utilisé le recfromcsv alors 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 record est un tuple avec le type donné.

Pour que vous puissiez 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')
64
askewchan

Si vous avez un tableau, a sur 210 lignes de 8 colonnes:

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

et souhaitez ajouter une neuvième colonne de zéros, vous pouvez le faire:

b = numpy.append(a,numpy.zeros([len(a),1]),1)
13
atomh33ls

J'ajoute une nouvelle colonne avec les uns à un tableau de la manière suivante:

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

Peut-être que ce n'est pas si efficace?

1
Tomas

Cela peut être fait comme ça:

import numpy as np

# create a random matrix:
A = np.random.normal(size=(5,2))

# add a column of zeros to it:
print(np.hstack((A,np.zeros((A.shape[0],1)))))

En général, si A est une matrice m * n et que vous devez ajouter une colonne, vous devez créer une matrice de zéros n * 1, puis utilisez "hstack" pour ajouter la matrice de zéros à droite de la matrice A .

0
aderchox