将 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)])
看看错误是否仍然存在。或者,在savetxt
call 中尝试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的主要内容,如果未能解决你的问题,请参考以下文章
将不同长度的numpy数组保存到同一个csv文件的最佳方法是啥?
Python | Python保存高维数组array,Python用pandas将numpy保存csv文件,Python保存3维数组