2017-03-21 53 views
2

說我有一個結構數組如下結構數組:如何使用numpy.savetxt與包含數組

a = np.zeros(10,dtype=[('label1',np.int32, 4), ('label2', np.float_)]) 

我嘗試它保存爲一個CSV文件:

np.savetxt('output.csv', a, fmt='%d,%d,%d,%d,%f') 

Python會產生這樣的錯誤:

ValueError: fmt has wrong number of % formats: %d,%d,%d,%d,%f 

我一直沒能創造會適合我的輸出格式化字符串。 %s在我這裏不起作用,因爲我需要指定浮點格式的能力。

是否可以從這種類型的結構化數組創建一個CSV文件?

回答

1

在本質上有什麼savetxt做的是:

for row in arr: 
    print(fmt % tuple(row)) 

所以fmt有一個row工作,或在這種情況下,您的數組的元素。

In [330]: a = np.zeros(10,dtype=[('label1',np.int32, 4), ('label2', np.float_)]) 
    ...: 
In [331]: a 
Out[331]: 
array([([0, 0, 0, 0], 0.), ([0, 0, 0, 0], 0.), ([0, 0, 0, 0], 0.), 
     ([0, 0, 0, 0], 0.), ([0, 0, 0, 0], 0.), ([0, 0, 0, 0], 0.), 
     ([0, 0, 0, 0], 0.), ([0, 0, 0, 0], 0.), ([0, 0, 0, 0], 0.), 
     ([0, 0, 0, 0], 0.)], 
     dtype=[('label1', '<i4', (4,)), ('label2', '<f8')]) 
In [332]: a[0] 
Out[332]: ([0, 0, 0, 0], 0.) 
In [333]: tuple(a[0]) 
Out[333]: (array([0, 0, 0, 0]), 0.0) 

營巢於label1 4個整數使得拿出一個可行的格式很難。這是一個如何Python'%'格式化的問題。

In [334]: '%s, %f'%_ 
Out[334]: '[0 0 0 0], 0.000000' 

如果a是5場會更容易

In [335]: a = np.zeros(10,dtype='i,i,i,i,f') 
In [336]: a 
Out[336]: 
array([(0, 0, 0, 0, 0.),.... 
     (0, 0, 0, 0, 0.)], 
     dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<i4'), ('f4', '<f4')]) 
In [337]: tuple(a[0]) 
Out[337]: (0, 0, 0, 0, 0.0) 
In [338]: '%d, %d, %d, %d, %f'%tuple(a[0]) 
Out[338]: '0, 0, 0, 0, 0.000000' 

我認爲你必須是「扁平化」你的陣列的結構,或編寫自定義savetxt。正如我表示savetxt不花哨。如果你可以print數組元素按你想要的格式,你可以將該格式寫入文件。

+0

感謝您的迴應 - 這很有道理。停止使用嵌套數組肯定會更容易,但是我的數組比我給出的示例更復雜 - 它包含許多字段,其中幾個字段包含嵌套的整數。在這種情況下,放棄結構化數組並使用正常數組是否有意義 - 使用其他方法跟蹤列? – Zapho

+0

取決於你在做什麼與陣列(S)。在SO問題中,結構化數組通常由'genfromtxt'通過讀取一個包含字符串和數字組合的'csv'創建。它甚至可以創建這樣的嵌套類型,儘管我沒有經常見到它。但是對於計算,多個數組通常與結構化數組一樣有用。你無法跨領域進行數學計算。 – hpaulj

相關問題