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__'

Чего Пробовал:

  1. пробовал онлайн-компилятор Ideone, получил ту же ошибку в Python3.xx.
  2. называют 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