【问题标题】:TypeError: Mismatch between array dtype ('<U32') and format specifier ('%.18e')TypeError:数组 dtype ('<U32') 和格式说明符 ('%.18e') 不匹配
【发布时间】:2020-09-13 12:31:48
【问题描述】:

我第一次使用np.savetxt,我试图将两个变量(一个字符串和一个浮点数)保存在一个名为“trial.csv”的文件中,如下所示:

import numpy as np

RT = 2.76197329736740
key_name = 'space'

print(RT,key_name)
# Save data in a CSV file named subj_data_file
np.savetxt("trial.csv", (RT,key_name), delimiter=',', header="RTs,Key_Name")

我收到以下错误:

TypeError: Mismatch between array dtype ('<U32') and format specifier ('%.18e')

我不明白('&lt;U32')('%.18e') 的含义。事实上,当我有浮点数、整数和字符串时,我不明白如何使用fmt ...

这是一个简化的示例,但具体而言,我会将 RT 值(浮点数)放在一列“RTs”中,将 key_name(浮点数)值放在另一列“Key_Name”中。稍后我将创建更多列,虽然我在此示例中为 RT 提供了一个值,为 key_name 提供了一个值,但“RTs”列中将有更多 RT 值以及“Key_Name”列中的键名。

【问题讨论】:

  • savetxt 将一个 numpy 数组写入文件,首先通过 fmt 将其转换为字符串。默认fmt 是“%.18e”,将数字转换为“1.234e10”之类的东西。要查看它试图保存的内容,print(np.array({RT, key_name))。使用savetxt 保存数字和字符串的组合并非易事。
  • @hpaulj 它打印{2.713, 'space'}。然后我应该选择一种不同的方法来将混合数据类型保存在 CSV 文件中吗?
  • 我收到array(['2.7619732973674', 'space'], dtype='&lt;U32')。它使用字符串值创建一个数组,而不是数字和字符串的混合。你真的必须用它保存标签的数字。对于初学者来说,仅保存和加载数字比混合数字和字符串要容易得多。

标签: python numpy typeerror


【解决方案1】:

这是因为np.savetxt() 中的默认fmt 参数是'%.18e',它适用于数字(整数/浮点数)。如果您还想保存字符串,则需要将fmt 参数更改为'%s'

此外,您需要更改X 形状以反映它是一行两列的事实。所以,你需要把np.savetxt 改成这样:

np.savetxt("trial.csv", [[RT, key_name]], fmt="%s", delimiter=',', header="RTs,Key_Name")

这意味着所有内容都将保存为字符串。因此,2.761.. 的值不会是浮点数。你可以像这样加载这个文件:

np.loadtxt("trial.csv",delimiter=',', dtype=str) #notice assiging dtype to str

【讨论】:

  • 此解决方案消除了类型错误,谢谢。但是,当我尝试使用data = np.loadtxt("trial.csv",delimiter=',') 然后pprint.pprint(data.tolist()) 加载数据时,我收到错误:ValueError: could not convert string to float: 'space'。此外,当我打开文件“trial.csv”时,我看到它创建了两列“RTs”和“Key_Name”,但两个值(2.76197329736740 和“space”)都在第一列 (RTs) 的行中,而不是在“Key_Name”列中有“空格”
  • np.loadtxt 中的默认数据类型为float,将其更改为str,如下所示:np.loadtxt("trial.csv",delimiter=',', dtype=str)。无论如何,我将编辑我的答案以包括这部分。
  • 它肯定会修复 ValueError,因为它将所有内容都转换为字符串 - 这对我来说是一个解决方案,因为我可以在处理数据时将值转换回浮点数。但是,我仍然将两个值(2.76197329736740 和“空间”)存储在单个列 (RT) 中。是不是因为格式fmt="%s"
  • 不,因为您表示数据的方式。我已将答案编辑为使用 [[RT, key_name]] 而不是 (RT, key_name)
【解决方案2】:
import numpy as np

names  = np.array(['NAME_1', 'NAME_2', 'NAME_3'])
floats = np.array([ 0.1234 ,  0.5678 ,  0.9123 ])

ab = np.zeros(names.size, dtype=[('key_name', 'U6'), ('RT', float)])
ab['key_name'] = names
ab['RT'] = floats

np.savetxt('trial.csv', ab, fmt="%10s , %10.3f", header="Keys_Names,RTs")

【讨论】:

  • 感谢您的解决方案!我尝试按如下方式创建标题:np.savetxt('trial.csv', ab, fmt="%10s %10.3f", header="Keys_Names,RTs") 但所有值(浮点数和名称)都在同一列“Keys_Names”下。如何添加标题并将彼此分配给其各自的变量?
  • 不客气,你只需要在 fmt 之间添加一个 ,
  • @Kathia 我编辑了我的答案,因为您希望标题与列值对齐,如果我能解决,请接受答案。
猜你喜欢
  • 2018-06-22
  • 2018-01-16
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 2021-07-28
  • 2023-04-03
  • 2021-11-23
  • 2021-12-15
相关资源
最近更新 更多