首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从np.genfromtxt添加的ndarray中删除“b”字符

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

Stack Overflow用户
提问于 2019-04-23 11:40:12
回答 3查看 2K关注 0票数 3

我有一个文本文件,它包含字符串、整数和浮点数两种形式的信息行,用空格分隔。

HIP893

HIP1074 1074 43_20 

HIP1325 1325型23_10粉末冶金7

..。

我使用以下行导入了这些数据:

代码语言:javascript
运行
复制
data=np.genfromtxt('98_info.txt', dtype=(object, object, int,float,float))

但是,当我这样做时,我得到的输出是

代码语言:javascript
运行
复制
[(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”,而是:

代码语言:javascript
运行
复制
[('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数组的形式导入,那就更好了,但如果不是,那就不是问题了。

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-23 16:11:16

用你的样本和dtype

代码语言:javascript
运行
复制
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):

代码语言:javascript
运行
复制
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(必须包括一个大小):

代码语言:javascript
运行
复制
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接受下划线。

代码语言:javascript
运行
复制
In [20]: int('23_10')                                                           
Out[20]: 2310
票数 2
EN

Stack Overflow用户

发布于 2019-04-23 11:54:39

您可以使用解码字节字符串的函数传递converters=,例如:

代码语言:javascript
运行
复制
convs = dict.fromkeys([0, 1], bytes.decode)
data = np.genfromtxt('98_info.txt', dtype=(object, object, int, float, float), converters=convs)

这给您提供了以下data

代码语言:javascript
运行
复制
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')])
票数 3
EN

Stack Overflow用户

发布于 2019-04-23 11:46:57

后面跟着b的字符串是编码字符串,即在bytes

您可以通过应用decode函数或仅通过str对它们进行解码。

代码语言:javascript
运行
复制
newData = [(str(x) if isinstance(x,bytes) else x for x in y) for y in data]

我认为您可以通过this将其转换为nparray,所以请回答

我真的不知道nparray

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55810419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档