如何找到正确的numpy`savetxt()`格式?

时间:2018-08-18 20:29:38

标签: numpy string-formatting

假设我有以下特殊数据集:

a = np.asarray([[[1,2,3], 'austen', 'austen-emma'],
                [[4,5,6], 'austen', 'austen-sense']])

format

通话的权利是什么
np.savetxt(f, a, fmt=format)

我已经基于函数documentation尝试了format=[[%d], %s, %s],但是仍然遇到TypeError。我在这里想念什么?

2 个答案:

答案 0 :(得分:1)

一个简单的%s应该可以解决您的问题,尽管您也可以指定更复杂的格式,所以以下代码将起作用:

import numpy as np
a = np.asarray([[[1,2,3], 'austen', 'austen-emma'],
                 [[4,5,6], 'austen', 'austen-sense']])
np.savetxt("abc",a,fmt="%s")

为什么会出现错误,是因为默认格式为 float ,此处为%s ,我们将格式设置为字符串。

答案 1 :(得分:1)

In [119]: a = np.asarray([[[1,2,3], 'austen', 'austen-emma'],
     ...:                  [[4,5,6], 'austen', 'austen-sense']])
     ...:                  
In [120]: a
Out[120]: 
array([[list([1, 2, 3]), 'austen', 'austen-emma'],
       [list([4, 5, 6]), 'austen', 'austen-sense']], dtype=object)

a进行n复制粘贴会生成一个对象dtype数组。它包含字符串和列表。

我们可以指定一种非常通用的%s格式:

In [121]: np.savetxt('test', a, fmt='%s, %s, %s')  # or fmt='%s',delimiter=','
In [122]: cat test
[1, 2, 3], austen, austen-emma
[4, 5, 6], austen, austen-sense

结果是列表的打印表示形式,例如str([1,2,3]和字符串。

但是csv加载程序将无法处理列表表示形式。

我可以将定界符更改为;因此它不会与列表字符串中的混淆:

In [128]: np.savetxt('test', a, fmt='%s', delimiter=';')
In [129]: cat test
[1, 2, 3];austen;austen-emma
[4, 5, 6];austen;austen-sense
In [130]: np.genfromtxt('test',delimiter=';', dtype=str)
Out[130]: 
array([['[1, 2, 3]', 'austen', 'austen-emma'],
       ['[4, 5, 6]', 'austen', 'austen-sense']], dtype='<U12')

不错-但是列表已作为字符串加载。

一种方法或其他方法(包括数组中的列表以及字符串)在加载时会产生问题。 csv的标准格式无法处理同一行中的列表和字符串。通常csv具有简单的值,例如。数字或字符串,由定界符分隔。它没有定义括号之类的语法功能。