2013-04-04 101 views
25

我想將一列添加到從recfromcsv創建的數組中。在這種情況下,它是一個數組:[210,8](行,列)。如何將列添加到numpy數組

我想添加第九列。空或零與無關緊要。

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

什麼不工作呢? – 2013-04-04 15:52:18

+0

不工作的事情是,無論我嘗試什麼版本,它都不會給我正確的尺寸。 – user2130951 2013-04-04 18:13:36

回答

49

我認爲你的問題是你期望np.append就地添加列,但是它做了什麼,因爲存儲的數據是如何變化的,就是創建一個連接數組的副本

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. 

所以你需要保存輸出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) 

替代方式:

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

我相信,(np.vstack以及)這三種功能之間的唯一區別是他們在axis未指定時的默認行爲:

  • concatenate假定axis = 0
  • hstack假定axis = 1除非輸入是一維,然後axis = 0
  • vstack添加軸之後假定axis = 0如果輸入是一維
  • append變平陣列

基於你的評論,並更仔細地查看你的示例代碼,我現在相信你是一個可能想要做的是添加一個字段record array。您同時導入了genfromtxt,它返回structured arrayrecfromcsv,它返回微妙不同的record array (recarray)。你現在使用的recfromcsv所以現在my_data實際上是recarray,這意味着最有可能的my_data.shape = (210,)因爲recarrays是1d的記錄數組,其中每個記錄都是具有給定dtype的元組。

所以,你可以試試這個:

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

在_sum中獲得文件「d:\ python27 \ lib \ site-packages \ numpy \ core \ _methods.py」,第18行out = out,keepdims = keepdims) TypeError:無法使用彈性類型執行縮減 – user2130951 2013-04-04 17:23:46

+0

@ user2130951數組的'dtype'是什麼? 'my_data.dtype' – askewchan 2013-04-04 18:28:20

+0

@ user2130951您確定不想添加_field_嗎? – askewchan 2013-04-04 18:46:22

5

如果你有一個數組中,a 8列說210行:

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

,並要添加的零的第九列,你可以這樣做:

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

這會生成返回級聯((arr,values),axis = axis) ValueError:所有輸入數組必須具有相同的維數 – user2130951 2013-04-04 17:25:43

+0

hmmmm。雙重檢查。它適用於我(使用IDLE - python版本2.7) – atomh33ls 2013-04-05 12:30:36

+0

也許這是因爲,正如@askewchan所建議的,您實際上有一個recarry?我認爲這將工作,如果你使用'numpy.genfromtxt'或'numpy.loadtxt'導入? – atomh33ls 2013-04-05 14:32:16

1

我與那些添加一個新列矩陣陣列以這樣的方式

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

也許這是不是有效?

+1

不要使用列表理解,請使用['np.ones'](http://docs.scipy.org/doc/numpy/reference/generated/numpy.ones.html)或['np.ones_like'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.ones_like.html):'append([np.ones_like(Z)],ZT,0).T' – askewchan 2013-09-13 14:49:12