我有一个文本文件,其中包含以字符串,整数和浮点数形式的信息行,并用空格隔开,例如
HIP893 23_10 7 0.028
4
HIP1074 43_20 20 0.0141 1
HIP1325 23_10 7.0 0.02388 5
...
我已使用以下行导入了该数据:
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数组导入,但是如果没有的话,这不是问题。
谢谢!
答案 0 :(得分:2)
您可以将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')])
答案 1 :(得分:2)
随您的示例和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 dtypes(必须包含大小):
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:1:VisibleDeprecationWarning:不指定编码参数而读取unicode字符串的情况已被弃用。设置编码,将None设置为系统默认值。
在Py2中,默认的字符串类型是字节字符串;在Py3 unicode中。 genfromtxt
已使用bytestrings
与py2兼容。但是最新版本添加了encoding
参数。但是这种转换似乎仍然有些粗糙。
这可能就是为什么我得到i8
的原因; Python自己的int
接受下划线。
In [20]: int('23_10')
Out[20]: 2310
答案 2 :(得分:0)
后跟b
的字符串是已编码的字符串,即bytes
您可以通过应用decode
函数或仅通过str
解码它们
newData = [(str(x) if isinstance(x,bytes) else x for x in y) for y in data]
我认为您可以通过this这样的答案在nparray中将其转换
我真的不了解nparray