如何解决Python | S1矢量到字符串
我有一个| S1类型的向量“ char”,如下例所示:
masked_array(data=[b'E',b'U',b'3',b'7',b'6',b'8',b' ',b' '],mask=False,fill_value=b'N/A',dtype='|S1')
我想在其中获取字符串,在此示例中为“ EU3768”
此示例摘自netcdf文件。使用的库是netCDF4。
进一步的问题:为什么所有单个字母前面都有b?
感谢您的帮助:)
解决方法
首先让我们回答一个最基本的问题:每个字母前面的b是什么意思。 b仅表示字符串以字节为单位。数据的内部格式存储为utf-8。因此,要将其转换回字符串,必须对其进行解码。因此,以此作为序言,下面的代码即可解决问题。
我假设您可以从masked_array中提取数据。然后执行以下操作:
# Convert the list of bytes to a list of strings
ds = list(map(lambda x: x.decode('utf-8'),data))
# Covert List of strings to a String and strip any trailing spaces
sd = ''.join(ds).strip()
这当然可以在一行代码中执行,如下所示:
sd = ''.join(list(map(lambda x: x.decode('utf-8'),data))).strip()
,
作为后续问题的答案,您可以让Numpy通过仅处理基础字节来完成一些工作。例如,我可以通过以下方式创建大量相似形状的对象:
import numpy as np
from string import ascii_letters,digits
letters = np.array(list(ascii_letters + digits),dtype='S1')
v = np.random.choice(letters,(100_000,10))
前三个元素如下:
[[b'W' b'B' b'W' b'4' b'O' b'B' b'A' b'4' b'Q' b'n']
[b'I' b'I' b'T' b'u' b'K' b'K' b'U' b'a' b'r' b'r']
[b'V' b'f' b'n' b'U' b'G' b'0' b'j' b'R' b'm' b'C']]
然后我可以通过字节级别的语言将它们转换回字符串:
[bytes.decode(s) for s in np.frombuffer(v,dtype='S10')]
前三个看起来像:
['WBW4OBA4Qn','IITuKKUarr','VfnUG0jRmC']
这很有道理。这大约需要20毫秒,比通过Python的版本要快:
[b''.join(r).decode() for r in v]
大约200毫秒。这仍然比您发布的代码版本快得多,因此也许您可以更有效地访问netcdf。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。