2016-10-15 50 views
0

我想從一個空的numpy數組開始。隨着代碼的進展,第一列應填寫datetime.datetime,第二列填寫str,第三列填寫float,第四列填寫int如何創建空numpy數組來存儲不同種類的數據

我試過如下:

A = np.empty([10, 4]) 
A[0][0] = datetime.datetime(2016, 10, 1, 1, 0) 

我得到的錯誤:

TypeError: float() argument must be a string or a number 
+1

['Structured arrays'](http://docs.scipy.org/doc/numpy/user/basics.rec.html)可能是一個選項。 – Divakar

回答

1

結構化陣列的方法:

根據你的柱規格定義一個D型細胞:

In [460]: dt=np.dtype('O,U10,f,i') 
In [461]: from datetime import datetime 

Initalize空數組,用3個元件(未3×4)

In [462]: A = np.empty((3,), dtype=dt) 
In [463]: A 
Out[463]: 
array([(None, '', 0.0, 0), (None, '', 0.0, 0), (None, '', 0.0, 0)], 
     dtype=[('f0', 'O'), ('f1', '<U10'), ('f2', '<f4'), ('f3', '<i4')]) 

填一些值 - 按字段名稱(不是列號)

In [464]: A['f1']=['one','two','three'] 
In [465]: A['f0'][0]=datetime(2016, 10, 1, 1, 0)  
In [467]: A['f2']=np.arange(3) 
In [468]: A 
Out[468]: 
array([(datetime.datetime(2016, 10, 1, 1, 0), 'one', 0.0, 0), 
     (None, 'two', 1.0, 0), 
     (None, 'three', 2.0, 0)], 
     dtype=[('f0', 'O'), ('f1', '<U10'), ('f2', '<f4'), ('f3', '<i4')]) 

查看該數組的元素:

In [469]: A[0] 
Out[469]: (datetime.datetime(2016, 10, 1, 1, 0), 'one', 0.0, 0) 

我選擇了把第一場object D型,所以它可以容納一個datetime對象 - 這是不是一個數字或字符串。

np.datetime64存儲有日期作爲浮動,並提供了大量的功能,datetime對象並不:

In [484]: dt1=np.dtype('datetime64[s],U10,f,i') 
In [485]: A1 = np.empty((3,), dtype=dt1) 
In [486]: A1['f0']=datetime(2016, 10, 1, 1, 0) 
In [487]: A1['f3']=np.arange(3) 
In [488]: A1 
Out[488]: 
array([(datetime.datetime(2016, 10, 1, 1, 0), '', 0.0, 0), 
     (datetime.datetime(2016, 10, 1, 1, 0), '', 0.0, 1), 
     (datetime.datetime(2016, 10, 1, 1, 0), '', 0.0, 2)], 
     dtype=[('f0', '<M8[s]'), ('f1', '<U10'), ('f2', '<f4'), ('f3', '<i4')]) 

第三種方法是使整個陣列對象D型。這實際上是一個榮耀的名單。許多操作採用簡單的迭代,或者只是沒有實現。它更一般,但是你失去了普通數字陣列的很多功能。

1

您可以使用dtype=object

A = np.empty([10, 4], dtype=object) 
A[0][0] = datetime.datetime(2016, 10, 1, 1, 0) 

也可以使用結構化數組,但是對於字符串對象有一個固定的長度。如果你需要任意大的物體,你必須使用dtype=object。但是這經常與陣列的目的相矛盾。

+0

你是什麼意思「與數組的目的相矛盾」?它會影響性能嗎? – Zanam

相關問題