Ошибка ODEINT: ValueError: установка элемента массива с последовательностью [duplicate]

Первый ответ сказал, что недостающий модуль - это «Перцептрон-теггер», на самом деле его имя в nltk.download - «averaged_perceptron_tagger»

Вы можете использовать это, чтобы исправить ошибку

nltk.download('averaged_perceptron_tagger')

23
задан DSM 9 November 2012 в 18:26
поделиться

6 ответов

Вы получаете сообщение об ошибке

ValueError: setting an array element with a sequence.

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

kOUT[i]=func(TempLake[i],Z)

Эта строка пытается установить элемент ith из kOUT на то, что возвращает func(TempLAke[i], Z). Глядя на случай i=0:

In [39]: kOUT[0]
Out[39]: 0.0

In [40]: func(TempLake[0], Z)
Out[40]: array([ 0.,  0.,  0.,  0.])

Вы пытаетесь загрузить 4-элементный массив в kOUT[0], который имеет только float. Следовательно, вы пытаетесь установить элемент массива (левая сторона, kOUT[i]) с последовательностью (правая сторона, func(TempLake[i], Z)).

Вероятно, func не делает что вы хотите, но я не уверен, что вы действительно хотели этого сделать (и не забывайте, что вы обычно можете использовать векторизованные операции, такие как A * B, а не цикл в numpy.) В любом случае это должно объяснить проблему.

39
ответ дан DSM 19 August 2018 в 13:17
поделиться
  • 1
    Я также нашел сообщение загадочным. – SherylHohman 29 March 2017 в 00:39
  • 2
    Существует обсуждение gtyub numpy ( github.com/numpy/numpy/issues/6584 ) об изменении этого сообщения, чтобы лучше описывать различные ситуации, которые создаются. Ответ Джонни Вонга ниже пояснил, что происходит в моем случае. – SherylHohman 29 March 2017 в 00:45
  • 3
    Я хотел бы, чтобы это говорило мне, что элемент WHAT установлен в последовательности WHAT. Не упоминать об этом бесполезно. – Louis 14 April 2017 в 08:58
  • 4
    @Louis: Что бы это могло сделать? Код, генерирующий сообщение об исключении, не имеет доступа к именам kOUT, i, func, TempLake и т. Д., И они все равно находятся в трассировке. Он просто имеет массив, индекс и последовательность, и попытка включить либо массив, либо последовательность в сообщении об ошибке может принимать сотни строк вывода для операндов умеренного размера. – user2357112 9 August 2017 в 18:04
  • 5
    Да, это определенно загадочное сообщение. Windows BSOD может быть даже более полезной, чем эта. – Dave Voyles - MSFT 15 May 2018 в 13:03
Z=np.array([1.0,1.0,1.0,1.0])  

def func(TempLake,Z):
    A=TempLake
    B=Z
    return A*B
Nlayers=Z.size
N=3
TempLake=np.zeros((N+1,Nlayers))
kOUT=np.vectorize(func)(TempLake,Z)

Это тоже работает, вместо того, чтобы зацикливать, просто векторизовать, но читать ниже заметки из скудной документации: https://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize. html

Функция векторизации предоставляется в первую очередь для удобства, а не для производительности. Реализация по существу является циклом for.

Если otypes не указывается, то вызов функции с первым аргументом будет использоваться для определения количества выходов. Результаты этого вызова будут кэшироваться, если кеш имеет значение True, чтобы предотвратить вызов функции дважды. Однако для реализации кеша должна быть завершена оригинальная функция, которая замедлит последующие вызовы, поэтому сделайте это только в том случае, если ваша функция будет дорогой.

1
ответ дан Ahalya L 19 August 2018 в 13:17
поделиться

Я считаю, что массивы python просто принимают значения. Поэтому преобразуем его в список:

kOUT = np.zeros(N+1)
kOUT = kOUT.tolist()
3
ответ дан Luis Renato 19 August 2018 в 13:17
поделиться

KOUT [i] - это один элемент списка. Но вы назначаете список этому элементу. ваш func генерирует список.

-1
ответ дан Shahzamal 19 August 2018 в 13:17
поделиться

Чтобы поместить последовательность или другой массив numpy в массив numpy, просто измените эту строку:

kOUT=np.zeros(N+1)

на:

kOUT=np.asarray([None]*(N+1))

Или:

kOUT=np.zeros((N+1), object)
0
ответ дан Stephen Rauch 19 August 2018 в 13:17
поделиться

Жаль, что оба ответа определяют проблему, но не дали заключения для ее решения. Давайте посмотрим на код.

Z = np.array([1.0, 1.0, 1.0, 1.0])  

def func(TempLake, Z):
    A = TempLake
    B = Z
    return A * B
Nlayers = Z.size
N = 3
TempLake = np.zeros((N+1, Nlayers))
kOUT = np.zeros(N + 1)

for i in xrange(N):
    # store the i-th result of
    # function "func" in i-th item in kOUT
    kOUT[i] = func(TempLake[i], Z)

Ошибка показывает, что вы устанавливаете i-й элемент kOUT (dtype: int) в массив, каждый элемент в kOUT является всего лишь объектом int, не может указывать на другой тип данных, вы должны изменить оператор, чтобы изменить тип данных kOUT. Например:

Измените следующую инструкцию:

kOUT = np.zeros(N + 1)

в:

kOUT = np.zeros(N + 1, dtype=object)

или:

kOUT = np.zeros((N + 1, N + 1))

Весь код:

import numpy as np
Z = np.array([1.0, 1.0, 1.0, 1.0])

def func(TempLake, Z):
    A = TempLake
    B = Z
    return A * B

Nlayers = Z.size
N = 3
TempLake = np.zeros((N + 1, Nlayers))

kOUT = np.zeros(N + 1, dtype=object)
for i in xrange(N):
    kOUT[i] = func(TempLake[i], Z)

Надеюсь, он вам поможет.

16
ответ дан XavierStuvw 19 August 2018 в 13:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: