类型错误:数组数据类型为 'object',但格式说明符为 '%.18e'。

46

我有如下数组:

X = np.array([image_array_to_vector1,image_array_to_vector2,image_array_to_vector3,image_array_to_vector4])

X 的打印输出如下:

[array([167, 167, 169, ...,   1,   1,   1], dtype=uint8)
 array([42, 43, 43, ..., 41, 36, 34], dtype=uint8)
 array([0, 0, 0, ..., 0, 0, 0], dtype=uint8)
 array([0, 0, 0, ..., 0, 0, 0], dtype=uint8)]

当我尝试将数据保存为txt文件时:

X_to_text_file = np.savetxt('x.txt',X)

我得到以下内容:

File "/Library/Python/2.7/site-packages/numpy/lib/npyio.py", line 1258, in savetxt
    % (str(X.dtype), format))
TypeError: Mismatch between array dtype ('object') and format specifier ('%.18e')
为什么会这样?我该怎么解决这个问题呢?
谢谢。

1
请将对象数组写入文本文件,类似于 https://dev59.com/gpfga4cB1Zd3GeqPB9lB - Artier
是的,我看到了那个问题并尝试了不同的格式,但仍然遇到了相同的问题。 - Simplicity
4个回答

75

没有示例数据,要复制这个有点难,但是这是我想出来的。

arr = np.array([np.array([1,2,3]), np.array([1,2,3,4])])
arr
array([array([1, 2, 3]), array([1, 2, 3, 4])], dtype=object)
np.savetxt('x.txt', arr)
TypeError: Mismatch between array dtype ('object') and format specifier ('%.18e')

正如@Artier所指出的那样,在将对象数组写入 .txt 文件的已接受回答的结尾处有一小段代码片段,指出您可以使用fmt =%s将数组保存为字符串。对我来说,使用这种格式似乎解决了我的问题(再次说明,如果没有数据示例,我无法完全重现您的问题)。

np.savetxt('x.txt', arr, fmt='%s')

我想指出,如果您要保存不同的数组并希望有一个单一的位置来存储它们,savez非常有用。


3
fmt='%s' 很有用。谢谢。 - Farzad Amirjavid

12

本质上,savetxt 做的是:

for row in your_array:
    print(fmt % tuple(row))

其中fmt是由您的fmt参数(或默认值)以及列数和分隔符构建的。

您有一个对象数组(一维),因此写入/打印将如下:

 print(fmt % tuple(element))

%s 是唯一可以处理数组(或其他普通对象)的格式。

savetxt 适用于二维数值数组,这种数组会产生需要 csv 列。试图在其他东西上使用它,比如这个对象数组,将会让你头疼不已。

In [2]: A = np.empty((3,),dtype=object)
In [3]: A[:] = [np.arange(3),np.arange(1,4), np.arange(-3,0)]
In [4]: A
Out[4]: array([array([0, 1, 2]), array([1, 2, 3]), array([-3, -2, -1])], dtype=object)

In [6]: np.savetxt('test',A,fmt='%s')
In [7]: cat test
[0 1 2]
[1 2 3]
[-3 -2 -1]

迭代一维数组时,它必须跳过 tuple。在任何情况下,最好的选择是使用 %s 格式。否则,编写自己的自定义文件写入器。savetxt 并不是什么特别或强大的工具。

In [9]: for row in A:
   ...:     print('%s'%row)  
[0 1 2]
[1 2 3]
[-3 -2 -1]

3

我也遇到了相同的错误信息,看起来问题在于数组长度不同。所以你需要确保给np.savetxt相等长度的数组。


0

在使用一个旧的conda环境(其中numpy=1.13.1)时,我遇到了错误。

更新到numpy=1.16.2后,没有出现这样的错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接