【问题标题】:String arrays in float arrays without format change不改变格式的浮点数组中的字符串数组
【发布时间】:2017-12-08 20:12:31
【问题描述】:

有没有办法在浮点数数组中包含字符串而不改变数组的格式,这样所有浮点数都更改为字符串但字符串元素仍保留为字符串?

例如。

import numpy as np

a = np.array([ 'hi' , 1. , 2. , 3. ])

理想情况下,我希望格式保持与上面输入为“a”时的外观相同。

这给出了:

array(['hi', '1.0', '2.0', '3.0'], dtype='|S3')

那么如何将这样的数组保存为文本文件呢?

非常感谢,

J

【问题讨论】:

  • 在标签中提到python(因为我假设你使用的是这个)
  • 哎呀,我们走了,很抱歉-是的,我正在使用 Python
  • python 中的列表难道不是异构的吗?我不明白您面临的问题...
  • 问题是当我创建这个数组并尝试将其保存为文本文件时,由于数组 dtype 之间的不匹配,它不会这样做,所以基本上我在问如何克服这个问题并保存一个包含字符串和浮点数的数组,以便我可以读回文本文件并稍后在提取字符串和浮点数时使用。
  • 虽然指定 dtype=object 可能会解决您的一些问题,但这不是 NumPy 的设计工作方式,使用对象数组会导致奇怪的不兼容性并破坏 NumPy 数组相对于普通列表的大部分优势.

标签: python arrays string types format


【解决方案1】:

我猜您的问题是这样的:您想使用 np.savetxt() 转储数组 np.array([ 'hi' , 1. , 2. , 3. ]),但出现此错误:

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

如果是这种情况,您只需要在np.savetxt 中设置fmt kwarg。除了用于格式化浮点数据的默认%.18e,您可以使用%s,它将事物格式化为字符串,即使数组中的原始值是数字。

所以这会起作用:

import numpy as np
a = np.array([ 'hi' , 1. , 2. , 3. ])
np.savetxt("test.out",a,fmt="%s")

请注意,您可以使用原始列表执行此操作 - numpy 会为您将其转换为数组。所以例如你可以这样做:

np.savetxt("test.out",[ 'hi' , 1. , 2. , 3. ],fmt="%s")

它也应该可以正常工作。

对于问题的第一部分,这并不是 numpy 数组的真正用途。如果您尝试将不同的数据类型放入同一个数组中,那么您可能需要不同的数据结构。一个普通的 python 列表就可以了,但根据你的情况,dict 可能是你要找的。​​p>

编辑:根据评论线程和特定问题,看起来这是在数据文件上创建标题的尝试。这可以直接通过

np.savetxt("a.txt",a,header="title goes here")

这可以直接使用np.loadtxt() 读取,因为默认情况下,标题以# 开头,默认情况下np.loadtxt() 忽略以# 开头的行。

【讨论】:

  • 这是我遇到的确切错误,谢谢。这对保存文件很有用,但是如果您想加载该数组,则会收到一个错误,即无法将字符串转换为“hi”元素的浮点数。关于那个有什么想法吗?顺便谢谢你!
  • 没关系,我快速搜索了一下,发现如何做到这一点,谢谢 Astrokiwi!
  • 您能否提供您使用的方法,以便我可以将其添加到我的答案中?它将对未来的谷歌人有用。
  • 是的,没关系,如下所示: data = np.loadtxt('a.txt') # new line # data_floats = data[0,1:].astype(np.float)跨度>
  • 嗯 - 是你混合字符串和浮点数的原因,因为你想在输出文件的顶部有一个标题/标题行?在这种情况下,您可以使用np.savetxt("a.txt",a,header="title goes here"),它将以#title goes here 开始文件。然后你可以直接使用loadtxt,因为它会忽略任何以#开头的行。
【解决方案2】:

使用泡菜:

import pickle

a = ['abc',3,4,5,6,7.0]
pickle.dump( a, open( "save.p", "wb" ))
b = pickle.load( open( "save.p", "rb" ) )

print(b)

输出:

['abc', 3, 4, 5, 6, 7.0]

【讨论】:

  • 谢谢!如果您尝试 vstack 两个与 'a' 样式相同的数组,然后保存/打开,这将如何工作?
  • 如果您只需要 vstack,您仍然可以使用列表 c= [a]+[b]。但是,如果你需要更多的 numpy,如果你真的需要混合数据类型,你应该考虑使用pandas
  • 好的,谢谢,我会记住这一点并尝试另存为一种数据类型,提取我需要的列并将它们分别转换为不同的数据类型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多