如何从np.genfromtxt添加的ndarray中删除'b'字符

时间:2019-04-23 11:40:12

标签: python python-3.x numpy

我有一个文本文件,其中包含以字符串,整数和浮点数形式的信息行,并用空格隔开,例如

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数组导入,但是如果没有的话,这不是问题。

谢谢!

3 个答案:

答案 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