【问题标题】:numpy array changes to string when writing to file写入文件时numpy数组更改为字符串
【发布时间】:2018-11-28 18:22:23
【问题描述】:

我有一个数据框,其中一列是一个 numpy 数组:

 DF

      Name                     Vec
 0  Abenakiite-(Ce) [0.0, 0.0, 0.0, 0.0, 0.0, 0.043, 0.0, 0.478, 0...
 1  Abernathyite    [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
 2  Abhurite        [0.176, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.235, 0...
 3  Abswurmbachite  [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.25, 0.0,...

当我检查每个元素的数据类型时,会返回正确的数据类型。

 type(DF['Vec'].iloc[1])
 numpy.ndarray

我将它保存到一个 csv 文件中:

DF.to_csv('.\\file.csv',sep='\t')

现在,当我再次读取文件时,

new_DF=pd.read_csv('.\\file.csv',sep='\t')

并检查索引 1 处 Vec 的数据类型:

type(new_DF['Vec'].iloc[1])   
str

numpy 数组的大小为 1x127。

数据类型已从 numpy 数组更改为字符串。我还可以在各个向量中看到一些新的线元素。我认为这可能是由于将向量写入 csv 时出现了一些问题,但我不知道如何修复它。有人可以帮忙吗?

谢谢!

【问题讨论】:

  • 有关数据类型的信息不会保存到 CSV 文件中。 Pandas CSV 阅读器无法知道您尝试阅读的内容在过去是一个 NumPy 数组。您应该将数组单独保存为 .npy 文件,或者自己将字符串转换回数组。
  • 您应该在read_csv 中使用dtype。在documentation中提到了
  • 您还能期待什么。 csv是文本文件吗?数组的字符串格式,例如'[0 1 2]' 是它可以写​​第二列的唯一方法。它不能编写数组的某种二进制表示形式(可能使用pickle.dumps 除外)。查看csv 文件(使用任何文本查看器)。
  • 我将 read_csv 命令更改为: new_DF=pd.read_csv('.\\file.csv',sep='\t',dtype={'Vec':np.ndarray}) 但是,新的错误是:dtype not理解
  • dtype 指的是数组的元素,而不是整个数组的type。我不认为read_csv 可以处理这种类型的输入。尽管在数据帧中处理这些字符串是可能的。

标签: pandas file numpy type-conversion


【解决方案1】:

在 cmets 中我犯了一个错误,说 dtype 而不是 converters。您想要的是在使用函数读取它们时转换它们。带有一些虚拟变量:

df=pd.DataFrame({'name':['name1','name2'],'Vec':[np.array([1,2]),np.array([3,4])]})
df.to_csv('tmp.csv')
def converter(instr):
    return np.fromstring(instr[1:-1],sep=' ')
df1=pd.read_csv('tmp.csv',converters={'Vec':converter})
df1.iloc[0,2]
array([1., 2.])

【讨论】:

  • 谢谢!这完全奏效了。最后一行是什么:df1.iloc[0,2]。它返回'name1'
  • 这只是为了表明Vec 列被转换为一个数组。
  • 嗨,你能看看我非常相似的问题吗?我遵循了您的回答,但只收到了空的 [] 字段。谢谢stackoverflow.com/questions/60960170/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 2019-06-14
  • 2014-07-31
  • 1970-01-01
相关资源
最近更新 更多