我有一个文本文件,其中包含字符串、整数和浮点数形式的信息行,用空格隔开,例如。
HIP893 23 U 10 7 0.028
4个
HIP1074 43_20 0.0141 1号
HIP1325 23 U 10 7 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,但这给了我一个错误“非字符串数组上的字符串操作”,我猜是因为我的数据是字符串和数字的组合吧?
是否有某种方法可以删除字符,但将数据保存在数组中,或者可能有另一种方法可以加载将字符串保留在引号中的信息以及不带引号的数字?
如果有一种方法可以更好地将其导入为2dnp数组,但如果没有,那就不是问题了。
谢谢!

最佳答案

你的样品和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数据类型(必须包含大小):
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大小写为第2列选择整数类型(下划线应该可以防止这种情况)。
dtype=None如果不使用编码参数,则会引发此警告:
/usr/local/bin/ipython3:1:VisibleDeprecationWarning:不推荐在不指定编码参数的情况下读取unicode字符串设置编码,对系统默认值使用none。
在py2中,默认的字符串类型是bytestrings;在py3 unicode中。genfromtxt与py2兼容使用了bytestrings。但最新版本增加了encoding参数。但这一转变似乎仍有一些粗糙的边缘。
这可能就是我得到i8的原因;python自己的int接受下划线。
In [20]: int('23_10')
Out[20]: 2310

10-04 11:32
查看更多