Numpy savetxt异构数据

时间:2014-01-18 12:10:30

标签: python numpy scipy scikit-learn

我有两个阵列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.

我该怎么做?

3 个答案:

答案 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。这允许我们使用ab填充数组 简单作业data2['a'] = adata2['b'] = b

接下来,我们在脚本中创建一个名为data的数组的视图, 将数据类型dtallM+1字段一起使用。第一个字段是a 字符串,其余是浮点数。

现在我们可以使用datasavetxt写入文件。提供格式 对于第一个与其他领域不同的领域,我们将建立一个 整行的完整格式字符串,并将其作为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')