我想将这些字符串值转换为int16数据类型的numpy数组
import numpy as np
raw=b''
w="\x01\x02 \x01\x02"
w1="\x01\x03 \x04"
p=w.replace(" ", "")
w1=w1.replace(" ","")
raw +=p
raw +=w1
results = np.fromstring(raw, dtype=np.uint16)
print results
我收到的错误是:
>File "prj1.py", line 11, in <module>
> results = np.fromstring(raw, dtype=np.uint16)
>ValueError: string size must be a multiple of element size
如何将这些字符串转换为numpy arrray,数据类型为int16?
答案 0 :(得分:2)
如错误消息所述,如果fromstring
是二进制输入数据,则数据长度必须是元素大小的倍数。这也在文档中说明。在您的情况下,元素大小为2,因为uint16
由两个字节组成。但是在第二个字符串w1
中,您只提供1个字节。解决此问题的一种方法是将前导零添加到较小的数字:
import numpy as np
raw=b''
w="\x01\x02 \x01\x02"
w1="\x01\x03 \x04"
elements=w.split(' ')+w1.split(' ')
raw=b''.join(['\x00'+e if len(e)==1 else e for e in elements ])
results = np.fromstring(raw, dtype=np.uint16)
print results
输出:
[ 513 513 769 1024]
对我来说,这个结果令人惊讶。显然,字节是从左到右(从最小到最大)读取的。我不知道这是特定于平台的(我是osx
)还是numpy
中总是如此。无论如何,如果你想要的字节顺序是从右到左,你可以像这样颠倒顺序:
raw2=b''.join([e+'\x00' if len(e)==1 else e[1]+e[0] for e in elements])
results2 = np.fromstring(raw2, dtype=np.uint16)
print results2
导致:
[258 258 259 4]
答案 1 :(得分:0)
来自文档:
引发值错误:
如果字符串的大小不正确,无法满足请求的dtype
和count
您可以转换为uint8
raw = ""
w="\x01\x02 \x01\x02"
w1="\x01\x03 \x04"
p=w.replace(" ", "")
w1=w1.replace(" ","")
raw +=p
raw +=w1
results = np.fromstring(raw, dtype=np.uint8)
print(results)
[1 2 1 2 1 3 4]
如果您确实要转换为unit16,可以使用astype
results.astype(np.uint16)
array([1, 2, 1, 2, 1, 3, 4], dtype=uint16)