Подтвердить что ты не робот

Numpy ValueError: установка элемента массива с последовательностью. Это сообщение может появиться без существующей последовательности?

Почему я получаю это сообщение об ошибке? ValueError: установка элемента массива с последовательностью. Спасибо вам

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):
    kOUT[i]=func(TempLake[i],Z)
4b9b3361

Ответ 1

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

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. ) Это все равно должно объяснить проблему.

Ответ 2

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

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)

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

Ответ 3

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

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

Ответ 4

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, чтобы предотвратить вызов функции дважды. Однако для реализации кеша должна быть завершена оригинальная функция, которая замедлит последующие вызовы, поэтому сделайте это только в том случае, если ваша функция стоит дорого.

Ответ 5

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

kOUT=np.zeros(N+1)

to:

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

Или:

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

Ответ 6

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

Ответ 7

Вы можете попробовать expand опции в Series.str.split('seperator', expand=True).
По умолчанию expand равно False.

expand: bool, по умолчанию False
Разверните разделенные строки на отдельные столбцы.

  • Если True, вернуть DataFrame/MultiIndex, расширяющую размерность.
  • Если False, вернуть Series/Index, содержащий списки строк.