将 numpy 数组保存到 csv 会产生 TypeError Mismatch

Posted

技术标签:

【中文标题】将 numpy 数组保存到 csv 会产生 TypeError Mismatch【英文标题】:Saving numpy array to csv produces TypeError Mismatch 【发布时间】:2016-08-01 20:39:44 【问题描述】:

我有一个 numpy 数组,其中包含以下形式的数字数据:

example = numpy.array([[[i for i in range(0, 5)],[0 for j in range(0, 5)]] for k in range(0, 10)])

所以它是 10 个组的数组,其中每个组由 2 个长度相等的列表组成,并且只包含数字。 运行以下保存代码会给我以下错误:

numpy.savetxt('exampleData.csv', test, delimiter=',')
TypeError: Mismatch between array dtype ('int32') and format specifier ('%.18e %.18e')

我猜这可以通过 fmt='xyz' 参数中的某些内容来解决,但文档不是特别清楚。任何帮助将不胜感激。

(在我的实际数据中,i 和 j 列表是长浮点数的列表,例如'0.0047322940571' 等)

【问题讨论】:

尝试example = numpy.array([[[float(i) for i in range(0, 5)],[0 for j in range(0, 5)]] for k in range(0, 10)]) 看看错误是否仍然存在。或者,在savetxtcall 中尝试fmt='%04d' 之类的格式。 @vmg 在我的实际代码中,i 和 j 的数据都是浮点数,我认为错误源于它不期望 k 中的第三个值。 数组的形状是什么? savetxt 仅适用于二维数组。 dtype 是什么? @hpaulj 啊,这可以解释,我猜它会归类为 3D 数组...我应该改用什么? 您期望什么样的布局?通常 CSV 只是多行匹配的列。读者通常会遇到空白行或具有不同列数的行的问题。列的内容类型可能不同 - 字符串、整数、浮点数,但它们应该是一致的。 【参考方案1】:

您的example 是一个 3d 数组

In [82]: example=np.array([[[i for i in range(0, 5)],[0 for j in range(0, 5)]] for  k in range(0, 3)])  # chg 10 to 3 for display

In [83]: example.shape
Out[83]: (3L, 2L, 5L)

In [84]: example
Out[84]: 
array([[[0, 1, 2, 3, 4],
        [0, 0, 0, 0, 0]],

       [[0, 1, 2, 3, 4],
        [0, 0, 0, 0, 0]],

       [[0, 1, 2, 3, 4],
        [0, 0, 0, 0, 0]]])

尝试保存整个内容会导致错误(由于版本不同导致的消息不同):

In [87]: np.savetxt('test.csv',example, delimiter=',')
....
TypeError: float argument required, not numpy.ndarray 

但保存一个“行”是可以的

In [88]: np.savetxt('test.csv',example[1,...], delimiter=',')

以整数格式保存会产生更漂亮的输出

In [94]: np.savetxt('test.csv',example[1,...], delimiter=',',fmt='%d')

In [95]: with open('test.csv') as f:print f.read()
0,1,2,3,4
0,0,0,0,0

那么您希望如何保存 3d 数组?请记住您将如何使用它/阅读它。多个文件?一个文件中有多个块?

https://***.com/a/3685339/901925 是关于如何保存 3d 数组的 6 岁 SO 答案。简单的答案是打开一个文件,并对数组的切片执行多个savetxt。这会将数据保存在块中。但是加载这些块是另一个 SO 问题(之前已经出现过)。

In [100]: with open('test.csv','w') as f:
     ...:     for row in example:
     ...:         np.savetxt(f,row,delimiter=',',fmt='%d',footer='====')
     ...:         

In [101]: with open('test.csv') as f:print f.read()
0,1,2,3,4
0,0,0,0,0
# ====
0,1,2,3,4
0,0,0,0,0
# ====
0,1,2,3,4
0,0,0,0,0
# ====

响应您的评论,这有效

example=np.ones((4,2,100))
np.savetxt('test.csv',example[1,...], delimiter=',',fmt='%.18e')

另一种保存 3d 数组的方法是将其重塑为 2d。加载后将其重新整形为 3d,可能使用存储在注释行中的信息

np.savetxt('test.csv',example.reshape(-1,example.shape[-1]), delimiter=',',fmt='%.18e')

【讨论】:

谢谢,但现在我在使用您的 In[100] 行和“fmt=%.18e”时遇到了另一个错误。我的实际数组具有形状(4L、2L、100L),我收到错误 TypeError: Mismatch between array dtype ('float64') and format specifier ('%.18e %.18e...[x100])跨度> savetxt 迭代数组的第一个维度,并且对于每个 row,写入 format % tuple(row)format 派生自您的 fmt 参数和您输入的 .shape[1]【参考方案2】:
import numpy

example = numpy.array([[[i for i in range(0, 5)],[0 for j in range(0, 5)]] for k in range(0, 10)])
f = open('exampleData.csv', 'ab')
for i in example:
    numpy.savetxt(f, i, fmt='%i')

【讨论】:

我分别为 i、j 和 k 尝试了 fmt='%1.10E, %1.10E, &04d' 但我得到了一个 SyntaxError。问题似乎是遍历 k 列表?

以上是关于将 numpy 数组保存到 csv 会产生 TypeError Mismatch的主要内容,如果未能解决你的问题,请参考以下文章

将熊猫数据框保存到csv时如何保留numpy数组

将不同长度的numpy数组保存到同一个csv文件的最佳方法是啥?

将 Numpy 结构数组保存到 *.mat 文件

如何将 numpy 数组写入 csv 文件?

Python | Python保存高维数组array,Python用pandas将numpy保存csv文件,Python保存3维数组

展平 3D NumPy 数组中的内部元组并作为浮点数保存到 CSV