2015-10-09 63 views
1

numpy的允許我這樣做:numpy的陣列 - 附加指定的列

>>>data = np.genfromtxt(r'd:/temp/data.txt', delimiter = ',', names = True) 
>>>data['Time'] 
array([ 1., 2., 3.]) 

我怎樣才能讓陣列這樣?我的意思寫,如:

data = np.array([]) 
data.append(name = 'Time', data = [1., 2., 3.]) 
data['Time'] 
array([ 1., 2., 3.]) 
+0

標準免責聲明:與[pandas](http://pandas.pydata.org)DataFrames相比,recarrays在某些情況下非常方便。數據處理對大熊貓來說非常方便,如果需要,您可以在最後轉換爲重新數組。 – DSM

回答

2

你要創建一個Record Array/Structured Array,你可以檢出numpy.core.records.fromrecords -

In [35]: data = np.core.records.fromrecords([[1.], [2.], [3.]],names=['Time']) 

In [36]: data 
Out[36]: 
rec.array([(1.0,), (2.0,), (3.0,)], 
     dtype=[('Time', '<f8')]) 

In [37]: data['Time'] 
Out[37]: array([ 1., 2., 3.]) 
0

喜歡這個?

data = numpy.array([(1,), (2,), (3,)], dtype=[('Time', float)]) 

另見本有用module操縱Record Array

0

np.core.records具有用於創建和操作結構化陣列一些不錯的功能,但它也是很好的瞭解如何從頭開始構建這樣的陣列。

您的genfromtxt已從具有簡單字符串值列的文件讀取。我可以字符串列表重新創建它:

In [16]: data=np.genfromtxt(['Time','1.','2.','3.'],delimiter=',',names=True) 

In [17]: data 
Out[17]: 
array([(1.0,), (2.0,), (3.0,)], 
     dtype=[('Time', '<f8')]) 

In [18]: data['Time'] 
Out[18]: array([ 1., 2., 3.]) 

In [19]: data.dtype 
Out[19]: dtype([('Time', '<f8')]) 

的關鍵是從首部導出的dtype,並且數據的外觀。我建議從更復雜的csv文件中查看dtype

從零開始創建dtype有多種方法。重新創建這種情況的是dt = np.dtype([('Time',float)])

構建類似數組的一個好方法是使用np.zeros(或np.empty),指定大小和相同的dtype。一旦創建了數組,您可以逐字段填寫值。

In [20]: data2=np.zeros(3,dtype=data.dtype) 

In [21]: data2['Time']=[1,2,3] 

另一種創建結構化數組的方法是使用np.array。關鍵是數據必須作爲元組列表提供。

In [22]: data1=np.array([(1,),(2,),(3,)],dtype=data.dtype) 

查看np.core.records.fromrecords的代碼顯示了其他幾種方法。

在最一般的情況下,如果填充陣列行由行:

In [26]: data3=np.zeros(3,dtype=data.dtype)  
In [27]: for i,v in enumerate([1,2,3]): 
    ....:  data3[i]=(v,) 

如果字段具有完全相同的D型,你可以view二維數組新dtype

In [29]: np.array([1.,2.,3.]).view(data.dtype)