Numpy squeeze - у объекта 'list' нет атрибута 'squeeze' - PullRequest
0 голосов
/ 07 июня 2018

Можно запустить следующие коды и не получить ошибок:

>>> np.squeeze([''])
array('', dtype='<U1')
>>> np.squeeze([[]])
array([], dtype=float64)

Но работает:

>>> np.squeeze(['', []])

Возвращает следующую ошибку:

Traceback (most recent call last):
File "C:\Users\leonardo.schettini\Documents\recrutai\recrutai\testenv\lib\site-packages\numpy\core\fromnumeric.py", line 1240, in squeeze
    squeeze = a.squeeze
AttributeError: 'list' object has no attribute 'squeeze'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\leonardo.schettini\Documents\recrutai\recrutai\testenv\lib\site-packages\numpy\core\fromnumeric.py", line 1242, in squeeze
    return _wrapit(a, 'squeeze')
File "C:\Users\leonardo.schettini\Documents\recrutai\recrutai\testenv\lib\site-packages\numpy\core\fromnumeric.py", line 42, in _wrapit
    result = getattr(asarray(obj), method)(*args, **kwds)
File "C:\Users\leonardo.schettini\Documents\recrutai\recrutai\testenv\lib\site-packages\numpy\core\numeric.py", line 492, in asarray
    return array(a, dtype, copy=False, order=order)
ValueError: setting an array element with a sequence

Почемуэто происходит?!


РЕДАКТИРОВАТЬ:

какие версии?

  • python == 3,6
  • numpy == 1.14.3

почему вы хотите сжать такой список?

Я используюДомашний словарь, чтобы получить лемму синонимов и сокращений.Иногда, когда входное слово отсутствует в моем словаре, я выбираю его как лемму, иногда я предпочитаю отбрасывать слово.Лемма определяется как массив n слов.

Чтобы отслеживать реальную позицию леммы во входном тексте, я хотел добавить в свой список возврата лемму 0 слов, пустой список.На первый взгляд я подумал, что squeeze сам по себе опустит пустые списки ...

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

np.squeeze - это просто оболочка для a.squeeze(), метод массива.Ваш аргумент - это список, у которого нет этого метода.Итак, функция пытается создать массив из списка:

In [325]: np.array(['', []])
....
ValueError: setting an array element with a sequence

Вы пытаетесь создать массив из смеси объектов, строки и списка.

In [326]: np.array(['', []],object)
Out[326]: array(['', list([])], dtype=object)

Если вы скажете ему создать массив dtype объекта, он может.

Но без этой спецификации он сначала попытается создать массив dtype строки.Но тогда возникают проблемы при размещении списка в слот строки - отсюда и ошибка.

Помимо любопытства, зачем вам squeeze такой список?


Если бы список был первым, np.array может создать массив объектов:

In [327]: np.array([[],''])
Out[327]: array([list([]), ''], dtype=object)

Это лишь одна из особенностей работы np.array, когда предоставляется список предметов разных размеров и или типов.Его основная задача - сделать массив из списка аккуратно вложенных списков чисел или строк.

In [328]: np.array([[1,2,3,4]])
Out[328]: array([[1, 2, 3, 4]])
In [329]: np.squeeze([[1,2,3,4]])
Out[329]: array([1, 2, 3, 4])

Учитывая набор элементов, он должен «угадать», что вы действительно хотите;иногда он угадывает, а иногда сдается.

0 голосов
/ 07 июня 2018

Проблема в том, что вы не можете превратить ['', []] в массив из-за отсутствия правильно определенной размерности.Это видно по тому, что простой вызов np.array(['', []]) приводит к ошибке:

>>> np.array(['', []])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: setting an array element with a sequence

Из документов он говорит, что входные данные аргумента a должны быть array_like, а ['', []] нет (не все списки array_like).К сожалению, нет действительно простого отказоустойчивого способа определить, является ли он массивоподобным, как объяснено здесь :

Как правило, числовые данные располагаются в виде массива.Структура в Python может быть преобразована в массивы с помощью функции array ().Наиболее очевидные примеры - списки и кортежи.Смотрите документацию для array () для подробностей его использования.Некоторые объекты могут поддерживать протокол массива и разрешать преобразование в массивы таким способом.Простой способ узнать, можно ли преобразовать объект в массив с использованием array (), - это просто попробовать его в интерактивном режиме и посмотреть, работает ли он!(Путь Python).

Вы можете сделать: np.squeeze([[''], []]), если хотите, так как ([[''], []]) имеет правильно определенную размерность и поэтому может быть преобразован в массив numpy:

>>> np.squeeze([[''], []])
array([list(['']), list([])], dtype=object)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...