對於您是否對numpy
陣列結構或csv格式更感興趣,我有點困惑。
的np.savetxt
csv文件的作家不容易產生文本,如:
0.2, 4.3, 1.2
1.1, 2.2, 3.1
3.5, 4.1, 1.1, 4300
1.2, 3.3, 1.2
1.5, 2.4, 3.1
3.5, 2.1, 1.1, 4400
savetxt
不太靠譜。它打開一個用於寫入的文件,然後在輸入數組上迭代,寫入,每次一行到文件。有效:
for row in arr:
f.write(fmt % tuple(row))
其中fmt
具有%
字段中的row
的每個元素。在簡單的情況下,它構造了fmt = delimiter.join(['fmt']*(arr.shape[1]))
。換句話說,重複虛擬字段fmt
的列數。或者你可以給它一個多字段fmt
。
所以你可以使用普通的行/文件寫入方法來編寫自定義顯示。最簡單的方法是使用通常的print
表示讚揚,然後將其重定向到文件。
不過話說做到這一點,還有如何讀取回到一個numpy
會話的問題。 np.genfromtxt
可以處理丟失的數據,但您仍然必須包含分隔符。讀取塊(3行用空行分隔)也更爲棘手。這不是不可能的,但你必須做一些預處理。
當然genfromtxt
的是不是靠譜無論是。它逐行讀取文件,將每行轉換爲數字或字符串列表,並將這些列表收集在主列表中。只有在最後纔將該列表轉換爲數組。
我可以構建像與文本的數組:
In [121]: dt = np.dtype([('lbl',int), ('block', float, (3,3))])
In [122]: A = np.zeros((2,),dtype=dt)
In [123]: A
Out[123]:
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]])],
dtype=[('lbl', '<i4'), ('block', '<f8', (3, 3))])
In [124]: A['lbl']=[4300,4400]
In [125]: A[0]['block']=np.array([[.2,4.3,1.2],[1.1,2.2,3.1],[3.5,4.1,1.1]])
In [126]: A
Out[126]:
array([(4300, [[0.2, 4.3, 1.2], [1.1, 2.2, 3.1], [3.5, 4.1, 1.1]]),
(4400, [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]])],
dtype=[('lbl', '<i4'), ('block', '<f8', (3, 3))])
In [127]: A['block']
Out[127]:
array([[[ 0.2, 4.3, 1.2],
[ 1.1, 2.2, 3.1],
[ 3.5, 4.1, 1.1]],
[[ 0. , 0. , 0. ],
[ 0. , 0. , 0. ],
[ 0. , 0. , 0. ]]])
我可以由具有所有扁平的塊值一個txt加載:
In [130]: txt=b"""4300, 0.2, 4.3, 1.2, 1.1, 2.2, 3.1, 3.5, 4.1, 1.1"""
In [131]: txt
Out[131]: b'4300, 0.2, 4.3, 1.2, 1.1, 2.2, 3.1, 3.5, 4.1, 1.1'
genfromtxt
可以處理複雜的D型,從扁線列表中按順序分配值:
In [133]: data=np.genfromtxt([txt],delimiter=',',dtype=dt)
In [134]: data['lbl']
Out[134]: array(4300)
In [135]: data['block']
Out[135]:
array([[ 0.2, 4.3, 1.2],
[ 1.1, 2.2, 3.1],
[ 3.5, 4.1, 1.1]])
我不確定a回合寫它。如果我想使用savetxt
,我必須將其重新整形爲10列或場數組。
任何你不能使用熊貓的原因嗎?如果不是,你可能可以用numpy的'reshape','ravel'和'view'或者[結構化數組](http://docs.scipy.org/doc/numpy/user/basics.rec.html ) – JGreenwell