numpy frombuffer-AttributeError: объект' str 'не имеет атрибута' buffer '
Версия Python: 3.5.2 Версия Numpy: 1.12.1
ошибка:
import numpy as np
s = 'Hello World'
np.frombuffer(s, dtype='S1')
AttributeError: 'str' object has no attribute '__buffer__'
Чего Пробовал:
- пробовал онлайн-компилятор Ideone, получил ту же ошибку в Python3.xx.
- называют scipy faqs для совместимой версии numpy и python, в которой говорится: "NumPy поддерживает Python 2.серии x (версии 2.6 и 2.7), а также Python 3.2 и новее. Первый выпуск NumPy для поддержки Python 3 был NumPy 1.5.0."
Не могу понять проблему, попробовал stackoverflow для той же проблемы, но ничего не найдено, может быть, я пропустил его. Любые предложения или приводит к тому, почему ошибка и как ее решить в python3.xx.
1 ответов
в сеансе PY3:
In [62]: np.frombuffer('hello world')
...
AttributeError: 'str' object has no attribute '__buffer__'
In [63]: np.frombuffer(b'hello world')
...
ValueError: buffer size must be a multiple of element size
In [64]: np.frombuffer(b'hello world',dtype='S1')
Out[64]:
array([b'h', b'e', b'l', b'l', b'o', b' ', b'w', b'o', b'r', b'l', b'd'], dtype='|S1')
в PY3 типом строки по умолчанию является unicode. The b
используется для создания и отображения bytestrings.
на np.frombuffer
документы должны быть обновлены, чтобы отразить эту разницу. The 'hello world'
пример работает только с PY2 или с PY3 bytestrings.
как я отметил в комментариях, есть несколько вопросов, касающихся frombuffer
, что указывает на то, что он редко используется. np.array
является наиболее распространенным способом создания массива, даже из строки:
In [80]: np.array('hello')
Out[80]:
array('hello',
dtype='<U5')
или использовать list
разбить строку на символы:
In [81]: np.array(list('hello'))
Out[81]:
array(['h', 'e', 'l', 'l', 'o'],
dtype='<U1')
In [82]: np.array(b'hello')
Out[82]:
array(b'hello',
dtype='|S5')
In [83]: np.array(list(b'hello'))
Out[83]: array([104, 101, 108, 108, 111])
In [85]: np.fromiter('hello','S1')
Out[85]:
array([b'h', b'e', b'l', b'l', b'o'],
dtype='|S1')
In [86]: np.fromiter('hello','U1')
Out[86]:
array(['h', 'e', 'l', 'l', 'o'],
dtype='<U1')*
Я создал багу: https://github.com/numpy/numpy/issues/8933