TypeError: 数组 dtype ('|S32') 和格式说明符 ('%.7f %.7f %.7f %s') 不匹配

Posted

技术标签:

【中文标题】TypeError: 数组 dtype (\'|S32\') 和格式说明符 (\'%.7f %.7f %.7f %s\') 不匹配【英文标题】:TypeError: Mismatch between array dtype ('|S32') and format specifier ('%.7f %.7f %.7f %s')TypeError: 数组 dtype ('|S32') 和格式说明符 ('%.7f %.7f %.7f %s') 不匹配 【发布时间】:2021-02-23 14:34:11 【问题描述】:

我将一些变量堆栈保存到 .dat 文件中。 我有 4 个 numpy 数组构建如下:其中 3 个包含浮点数和一个时间字符串。这是所有 numpy.ndarray 的 type(np.array[n]) 输出:

<type 'numpy.float64'> <type 'numpy.float64'> <type 'numpy.float64'> <type 'numpy.string_'>

最后一个数组是用 datetime 模块构建的:

hr_time.append(datetime.datetime.fromtimestamp(time_unix).strftime("%Y-%m-%d %H:%M:%S.%f"))

然后我使用 zip 和 np.savetxt 如下:

zipped = zip(lat, lon, time_unix, hr_time)
np.savetxt("shadow_orbit.dat", zipped, fmt='%.7f %.7f %.7f %s')

我收到以下错误:

in savetxt
    % (str(X.dtype), format))
TypeError: Mismatch between array dtype ('|S32') and format specifier ('%.7f %.7f %.7f %s')

实际上对我来说不是必须这样保存文件,我可以只保存其中三个。事实上,正如您可能从代码中争辩的那样,hr_time 只是一个字符串,以一种更易于阅读的方式显示 time_unix 变量,所以将来我可以设法重新调整它,但为了快速浏览,拥有它真的很有帮助它也在文件中。

谁能帮助我?

提前致谢。

【问题讨论】:

查看zipped,然后再尝试在savetxt中使用它 np.savetxt 保存一个 numpy 数组,而不是一个 zip 对象。它将首先尝试将参数转换为数组。您是否尝试过遍历 zipped 并直接写入每一行(使用该格式)? 【参考方案1】:

一个更简单的例子:

In [93]: x,y = np.arange(4), np.array(['A','B','C','D'])
In [94]: zipped=zip(x,y)
In [95]: zipped
Out[95]: <zip at 0x7fe56f41a780>

zip 生成类似“生成器”的对象。 list(zipped) 实际查看元组。

np.savetxt 从 numpy 数组写入:

In [96]: np.array(zipped)
Out[96]: array(<zip object at 0x7fe56f41a780>, dtype=object)

但是你可以直接写压缩元组:

In [97]: for row in zipped:print('%.5f %s'%row)
0.00000 A
1.00000 B
2.00000 C
3.00000 D

只需将打印替换为文件写入即可。

np.savetxt 做了类似的事情

for row in arg:
    f.write(fmt%tuple(row))

但我认为直接写入文件会更容易(并且同样快)。

【讨论】:

以上是关于TypeError: 数组 dtype ('|S32') 和格式说明符 ('%.7f %.7f %.7f %s') 不匹配的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:在绘制 seaborn.regplot 时,无法根据规则“安全”将数组数据从 dtype('int64') 转换为 dtype('int32')

pandas 比较引发 TypeError:无法将 dtyped [float64] 数组与 [bool] 类型的标量进行比较

TypeError:数组 dtype 和格式说明符不匹配。如何将具有不同值类型的数据框保存为 txt 文件?

Scipy hstack 导致“TypeError:类型不支持转换:(dtype('float64'),dtype('O'))”

TypeError:无法将值 dtype('<M8[ns]') 转换为 TensorFlow DType

获取 TypeError:尝试使用 idxmax() 时,此 dtype 不允许缩减操作 'argmax'