使用带有标题的 np.savetxt 保存结构化的 numpy 数组

Posted

技术标签:

【中文标题】使用带有标题的 np.savetxt 保存结构化的 numpy 数组【英文标题】:Save structured numpy array using np.savetxt with header 【发布时间】:2018-06-25 15:51:50 【问题描述】:

我有一个

形式的结构数组
output = np.zeros(names.size, dtype=[('name', 'U32'), ('r', float),('m',float)])

然后我尝试使用 np.savetxt 将其保存到 csv 文件中。我想知道是否有办法也可以将每列的标签保存为 csv 文件的标题?

提前谢谢你。

【问题讨论】:

output.dtype.names 是这些字段名称的列表。您可以使用该格式作为标题行,例如' '.join(output.dtype.names) @hpaulj 那不是只给了我三列,我的所有数据都将出现在第一列中吗? 标题行不影响数据的布局。这由答案中指定的fmt 处理。对于savetxt,标头只是它与注释字符一起写入的字符串。 【参考方案1】:

您可以尝试类似于this SO answer 的解决方案来透视数据

dtypes = [('name', 'U32'), ('r', float),('m',float)]
a = np.zeros(5, dtype=dtypes)
b = numpy.vstack(map(list, a))

您将列表映射到recarray 元组上,然后垂直堆叠它们。

那么你可以做以下...

names = [n for n, t in dtypes]
numpy.savetxt('test.csv', b, header=','.join(names), fmt=','.join(['%s']*b.shape[1]))

【讨论】:

【参考方案2】:

下面是示例代码:

output = np.zeros(names.size, dtype=[('name', 'U32'), ('r', float),('m',float)])
np.savetxt("foo.csv", output, delimiter=",", header="name,r,m", fmt="%s,%f,%f", comments='')

作为documented here。

【讨论】:

它以这种方式给了我 3 列,但所有数据似乎都在第一列中。我猜这是因为结构化数组的每个元素都以'name float float'的形式出现。有没有办法将每个元素分成 3 列?【参考方案3】:

我发现自己经常遇到这个问题,所以我编写了一个函数来生成标题和格式化字符串以与np.savetxt 一起使用:

你可以在GitHub Gist找到代码。

我没有对它进行广泛的测试,但它可以处理大多数数据类型并生成(可选)自动填充输出。输出格式良好且易于阅读,支持拖放到 excel 中,并且可以轻松读回其中的字段名称和 dtypes 是自动检测的(大部分情况下)。

样本输出:

# x     y1       y2 bools   verylongnamewithshortcontent                     bytes                              objects
  0    -25  3.9e+03     1                              a      b'AvvOkBhFJZIUQsxdg'  'key1': 12423, 'key2': 'asdfjkl;'
  1    255    8e+03     1                              a                b'SxKvotv'  'key1': 12423, 'key2': 'asdfjkl;'
  2   -211  2.5e+03     0                              a              b'tvBQXgqqS'  'key1': 12423, 'key2': 'asdfjkl;'
  3   -830  5.7e+02     1                              a        b'NCFrZHfniaZjeUg'  'key1': 12423, 'key2': 'asdfjkl;'
  4  -3468  8.7e+03     0                              a          b'RxzuvyKCxKBsz'  'key1': 12423, 'key2': 'asdfjkl;'
  5   4644  2.2e+03     1                              a              b'yHijSVfCv'  'key1': 12423, 'key2': 'asdfjkl;'
  6  27946    4e+03     0                              a            b'ywyZeQICJrY'  'key1': 12423, 'key2': 'asdfjkl;'
  7 313770  3.2e+03     1                              a    b'HBEufqJuASVxHRIxpjd'  'key1': 12423, 'key2': 'asdfjkl;'
  8 -76304  7.7e+02     0                              a                     b'UX'  'key1': 12423, 'key2': 'asdfjkl;'
  9 427810  8.4e+03     0                              a            b'jmnOEWCvTWg'  'key1': 12423, 'key2': 'asdfjkl;'

输入/输出数据类型:

[('x', '<i4'), ('y1', '<i4'), ('y2', '<f8'), ('bools', '?'), ('verylongnamewithshortcontent', '<U7'), ('bytes', 'S20'), ('objects', 'O')]

[('x', '<i4'), ('y1', '<i4'), ('y2', '<f8'), ('bools', '<i4'), ('verylongnamewithshortcontent', '<U1'), ('bytes', '<U22'), ('objects', '<U35')]

【讨论】:

以上是关于使用带有标题的 np.savetxt 保存结构化的 numpy 数组的主要内容,如果未能解决你的问题,请参考以下文章

Np.savetxt 将标题与列对齐

numpy如何保存(存储)和读取数据?(.npy/.npz)np.save() np.savez() np.savetxt()

np.savetxt()——将array保存到txt文件,并保持原格式

Numpy中数据的常用的保存与读取

Numpy savetxt如何在那个位置指定零?

Numpy数组的保存与读取方法