Первый ответ сказал, что недостающий модуль - это «Перцептрон-теггер», на самом деле его имя в nltk.download - «averaged_perceptron_tagger»
Вы можете использовать это, чтобы исправить ошибку
nltk.download('averaged_perceptron_tagger')
Вы получаете сообщение об ошибке
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.) В любом случае это должно объяснить проблему.
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, чтобы предотвратить вызов функции дважды. Однако для реализации кеша должна быть завершена оригинальная функция, которая замедлит последующие вызовы, поэтому сделайте это только в том случае, если ваша функция будет дорогой.
Я считаю, что массивы python просто принимают значения. Поэтому преобразуем его в список:
kOUT = np.zeros(N+1)
kOUT = kOUT.tolist()
KOUT [i] - это один элемент списка. Но вы назначаете список этому элементу. ваш func генерирует список.
Чтобы поместить последовательность или другой массив numpy в массив numpy, просто измените эту строку:
kOUT=np.zeros(N+1)
на:
kOUT=np.asarray([None]*(N+1))
Или:
kOUT=np.zeros((N+1), object)
Жаль, что оба ответа определяют проблему, но не дали заключения для ее решения. Давайте посмотрим на код.
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)
Надеюсь, он вам поможет.
kOUT
,i
,func
,TempLake
и т. Д., И они все равно находятся в трассировке. Он просто имеет массив, индекс и последовательность, и попытка включить либо массив, либо последовательность в сообщении об ошибке может принимать сотни строк вывода для операндов умеренного размера. – user2357112 9 August 2017 в 18:04