numpy.fromstring中的ValueError

时间:2017-07-13 05:48:07

标签: python numpy

我想将这些字符串值转换为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?

2 个答案:

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

来自文档: 引发值错误: 如果字符串的大小不正确,无法满足请求的dtypecount

您可以转换为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)