对于您是否对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