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)
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 1dappend
aplatit un tableauSur 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')
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)
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?
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 .