web-dev-qa-db-ja.com

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)
24
user1419224

エラーメッセージが表示されています

_ValueError: setting an array element with a sequence.
_

配列要素をシーケンスで設定しようとしているためです。可愛くしようとはしていませんが、エラーメッセージは、問題が何であるかを正確に伝えようとしています。不可解なエラーとは思わないでください。単なるフレーズです。どの行が問題を引き起こしていますか?

_kOUT[i]=func(TempLake[i],Z)
_

この行は、ithkOUT要素を、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要素の配列を、floatのみを持つ_kOUT[0]_にロードしようとしています。したがって、配列(右側、func(TempLake[i], Z))で配列要素(左側、_kOUT[i]_)を設定しようとしています。

おそらくfuncはあなたがしたいことをしていないが、あなたが本当に何をしたいのかわからない(そしてあなたが通常numpyでループするのではなくA * Bのようなベクトル化された操作を使用できることを忘れないでください) )とにかく、問題を説明する必要があります。

41
DSM

両方の答えが問題を理解しているのは残念ですが、それを解決するための結論を出していません。コードを見てみましょう。

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)

このエラーは、kOUT(dtype:int)のi番目の項目を配列に設定したことを示しています。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)

それがあなたを助けることを願っています。

22
Johnny Wong

python配列は値を受け入れるだけです。だからリストに変換します:

kOUT = np.zeros(N+1)
kOUT = kOUT.tolist()
3
Luis Renato
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)

これも機能しますが、ループではなくベクトル化するだけですが、scipyのドキュメントから以下の注意をお読みください: https://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html

Vectorize関数は、パフォーマンスのためではなく、主に利便性のために提供されています。実装は基本的にforループです。

Otypesが指定されていない場合、出力の数を決定するために、最初の引数を持つ関数の呼び出しが使用されます。キャッシュがTrueの場合、関数の2回の呼び出しを防ぐため、この呼び出しの結果はキャッシュされます。ただし、キャッシュを実装するには、元の関数をラップする必要があります。これにより、以降の呼び出しが遅くなるため、関数が高価な場合にのみこれを行ってください。

1
Ahalya L

シーケンスまたは別のnumpy配列をnumpy配列に入れるには、次の行を変更します。

kOUT=np.zeros(N+1)

に:

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

または:

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