我有两个阵列A和B,这样:
A.shape是(N,1),dtype是int。 B.shape是(N,M),dtype是浮点数。
数组A包含ids /序列号。信息。我想在single file with their dtypes preserved
中写A和B,这样每行包含A [i]和B [i,:]即。
A[0], B[0, 0], B[0, 1], ..... , B[0, M-1]
A[1], B[1, 0], B[1, 1], ..... , B[1, M-1]
.
.
.
and so on.
我该怎么做?
答案 0 :(得分:5)
在致电fmt="%g"
时使用savetxt()
:
import numpy as np
a = np.random.randint(0, 100, 10)
b = np.random.rand(10, 3)
v = np.hstack((a[:,None],b))
import io
t = io.BytesIO()
np.savetxt(t, v, fmt="%g", delimiter=",")
print t.getvalue()
这是输出:
58,0.565189,0.865103,0.508969
23,0.916723,0.921158,0.0831125
59,0.277719,0.0093567,0.842342
2,0.647174,0.841386,0.26473
98,0.397821,0.552821,0.16494
62,0.369808,0.146442,0.569618
35,0.703737,0.288476,0.433288
94,0.756107,0.396098,0.896038
67,0.638921,0.891554,0.680056
82,0.449198,0.978571,0.116202
答案 1 :(得分:2)
(我太快地读了这个问题,错过了A
一个整数数组。以下可能是矫枉过正,但我会把它留在这里以防有人需要混合字符串和浮点数。)
如果数组是相同的数据类型,您可以连接它们,savetxt
可以正常工作。如果A
是一个数组,例如字符串,那将无效。要让savetxt
将此异构数据打印到文件,您需要使用structured array。这是一种方法。
这个想法是创建一个结构化数组,其第一个字段是一个字符串 (保持ids),其剩余的M字段是浮点数。 为了便于使用给定的数组填充此数组,我们将执行此操作 分两步。
首先,我们将创建一个结构化数组,其第一个字段是一个字符串
并且其第二个字段本身是M个浮点值的数组。
此数据类型在脚本中为dt2
,相应的数组为
data2
。这允许我们使用a
和b
填充数组
简单作业data2['a'] = a
和data2['b'] = b
。
接下来,我们在脚本中创建一个名为data
的数组的视图,
将数据类型dtall
与M+1
字段一起使用。第一个字段是a
字符串,其余是浮点数。
现在我们可以使用data
将savetxt
写入文件。提供格式
对于第一个与其他领域不同的领域,我们将建立一个
整行的完整格式字符串,并将其作为fmt
savetxt
的论据。
import numpy as np
# Example data.
a = np.array(['A001', 'A019', 'A344', 'A742'])
b = np.linspace(0, 1, 16, endpoint=False).reshape(4,4)
# Create a data dtype with two fields. The first field has the same
# data type as `a`. The second has the same fundamental data type as `b`,
# repeated N times. If you print dt2 using the above data, you'll see
# [('a', 'S4'), ('b', '<f8', (4,))]
dt2 = np.dtype([('a', a.dtype.str)] +
[('b', b.dtype.str, b.shape[1])])
# Create an empty array using `dt2`, and fill it with `a` and `b`.
data2 = np.empty(len(a), dtype=dt2)
data2['a'] = a
data2['b'] = b
# Create a data type with N+1 fields. If you print `dtall`, you'll see
# [('a', 'S4'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8'), ('f4', '<f8')]
dtall = np.dtype([('a', a.dtype.str)] + b.dtype.descr*b.shape[1])
# Create a view of the same data, but with data type `dtall`.
data = data2.view(dtall)
# Create the format string to be used in `savetxt`.
id_fmt = '"%s"' # The format of the id.
float_fmt = '%f' # The floating point format.
fmt = id_fmt + b.shape[1] * (',' + float_fmt)
# Finally, save the data.
np.savetxt('ab.csv', data, fmt=fmt)
以下是输出文件的内容:
"A001",0.000000,0.062500,0.125000,0.187500
"A019",0.250000,0.312500,0.375000,0.437500
"A344",0.500000,0.562500,0.625000,0.687500
"A742",0.750000,0.812500,0.875000,0.937500
答案 2 :(得分:1)
如果您不需要将数组保存为纯文本,我还会考虑使用np.savez
,这样可以将两个数组保存在一个二进制文件中。还有savez_compressed
提供的压缩版本。就个人而言,我经常使用h5py将多个数组保存到hdf5,但np.savez
提供了一个简单的接口,它内置于numpy中,因此它不需要任何其他依赖项。
import numpy as np
a = np.random.randint(0, 100, 10)
b = np.random.rand(10, 3)
np.savez('data.npz', a=a, b=b)
# Now load the data back in
data = np.load('data.npz')
a_loaded = data['a']
b_loaded = data['b']
In [9]: a_loaded.dtype
Out[9]: dtype('int64')
In [10]: b_loaded.dtype
Out[10]: dtype('float64')