我有一个文本文件,它包含字符串、整数和浮点数两种形式的信息行,用空格分隔。
HIP893
HIP1074 1074 43_20
HIP1325 1325型23_10粉末冶金7
..。
我使用以下行导入了这些数据:
data=np.genfromtxt('98_info.txt', dtype=(object, object, int,float,float))
但是,当我这样做时,我得到的输出是
[(b'HIP893', b'23_10', 7, 0.028, 4)
(b'HIP1074', b'43_20', 20, 0.0141, 1)
(b'HIP1325', b'23_10', 7, 0.02388, 5)
... ]
然而,我希望没有“b”,而是:
[('HIP893', '23_10', 7, 0.028, 4.0)
('HIP1074', '43_20', 20, 0.0141, 1.0)
('HIP1325', '23_10', 7, 0.02388, 5.0)
... ]
我尝试过NumPy的core.defchararray,但这给了我错误的‘非字符串数组上的字符串操作’,我猜可能是因为我的数据是字符串和数字的组合?
是否有某种方法可以删除字符,但将数据保存在数组中,或者是否有另一种方式加载将字符串置于引号和没有引号的数字中的信息?
如果有一种方法可以将它以2d np数组的形式导入,那就更好了,但如果不是,那就不是问题了。
谢谢!
发布于 2019-04-23 16:11:16
用你的样本和dtype
In [1]: np.genfromtxt('stack55810419.txt', dtype=(object, object, int,float,floa
...: t))
Out[1]:
array([(b'HIP893', b'23_10', 7, 0.028 , 4.),
(b'HIP1074', b'43_20', 20, 0.0141 , 1.),
(b'HIP1325', b'23_10', 7, 0.02388, 5.)],
dtype=[('f0', 'O'), ('f1', 'O'), ('f2', '<i8'), ('f3', '<f8'), ('f4', '<f8')])
使用dtype=None
(和encoding=None
):
In [5]: np.genfromtxt('stack55810419.txt', dtype=None, encoding=None)
Out[5]:
array([('HIP893', 2310, 7, 0.028 , 4),
('HIP1074', 4320, 20, 0.0141 , 1),
('HIP1325', 2310, 7, 0.02388, 5)],
dtype=[('f0', '<U7'), ('f1', '<i8'), ('f2', '<i8'), ('f3', '<f8'), ('f4', '<i8')])
指定unicode dtype(必须包括一个大小):
In [6]: np.genfromtxt('stack55810419.txt', dtype=('U7', 'U7', int,float,float))
Out[6]:
array([('HIP893', '23_10', 7, 0.028 , 4.),
('HIP1074', '43_20', 20, 0.0141 , 1.),
('HIP1325', '23_10', 7, 0.02388, 5.)],
dtype=[('f0', '<U7'), ('f1', '<U7'), ('f2', '<i8'), ('f3', '<f8'), ('f4', '<f8')])
我很困惑为什么None
大小写会为第二列选择一个整数的dtype (下划线应该阻止这一点)。
没有编码参数的dtype=None
引发此警告:
/usr/local/bin/ipython3 3:1: VisibleDeprecationWarning:在不指定编码参数的情况下读取unicode字符串是不可取的。设置编码,对系统默认使用None。
在Py2中,默认字符串类型是字节字符串;在Py3 unicode中。genfromtxt
使用bytestrings
与py2兼容。但是最近的版本添加了encoding
参数。但这种转换似乎仍有一些粗糙的边缘。
这可能是我获得i8
的原因;Python自己的int
接受下划线。
In [20]: int('23_10')
Out[20]: 2310
发布于 2019-04-23 11:54:39
您可以使用解码字节字符串的函数传递converters=
,例如:
convs = dict.fromkeys([0, 1], bytes.decode)
data = np.genfromtxt('98_info.txt', dtype=(object, object, int, float, float), converters=convs)
这给您提供了以下data
:
array([('HIP893', '23_10', 7, 0.028 , 4.),
('HIP1074', '43_20', 20, 0.0141 , 1.),
('HIP1325', '23_10', 7, 0.02388, 5.)],
dtype=[('f0', 'O'), ('f1', 'O'), ('f2', '<i8'), ('f3', '<f8'), ('f4', '<f8')])
发布于 2019-04-23 11:46:57
后面跟着b
的字符串是编码字符串,即在bytes
中
您可以通过应用decode
函数或仅通过str
对它们进行解码。
newData = [(str(x) if isinstance(x,bytes) else x for x in y) for y in data]
我认为您可以通过this将其转换为nparray,所以请回答
我真的不知道nparray
https://stackoverflow.com/questions/55810419
复制相似问题