ValueError:シーケンスで配列要素を設定する


183

このPythonコード:

import numpy as p

def firstfunction():
    UnFilteredDuringExSummaryOfMeansArray = []
    MeanOutputHeader=['TestID','ConditionName','FilterType','RRMean','HRMean',
                      'dZdtMaxVoltageMean','BZMean','ZXMean','LVETMean','Z0Mean',
                      'StrokeVolumeMean','CardiacOutputMean','VelocityIndexMean']
    dataMatrix = BeatByBeatMatrixOfMatrices[column]
    roughTrimmedMatrix = p.array(dataMatrix[1:,1:17])


    trimmedMatrix = p.array(roughTrimmedMatrix,dtype=p.float64)  #ERROR THROWN HERE


    myMeans = p.mean(trimmedMatrix,axis=0,dtype=p.float64)
    conditionMeansArray = [TestID,testCondition,'UnfilteredBefore',myMeans[3], myMeans[4], 
                           myMeans[6], myMeans[9], myMeans[10], myMeans[11], myMeans[12],
                           myMeans[13], myMeans[14], myMeans[15]]
    UnFilteredDuringExSummaryOfMeansArray.append(conditionMeansArray)
    secondfunction(UnFilteredDuringExSummaryOfMeansArray)
    return

def secondfunction(UnFilteredDuringExSummaryOfMeansArray):
    RRDuringArray = p.array(UnFilteredDuringExSummaryOfMeansArray,dtype=p.float64)[1:,3]
    return

firstfunction()

次のエラーメッセージをスローします。

File "mypath\mypythonscript.py", line 3484, in secondfunction
RRDuringArray = p.array(UnFilteredDuringExSummaryOfMeansArray,dtype=p.float64)[1:,3]
ValueError: setting an array element with a sequence.

上記の壊れたコードの問題を修正してエラーメッセージをスローしないようにする方法を誰かに教えてもらえますか?


編集: 私はマトリックスの内容を取得するために印刷コマンドを実行しました、そしてこれはそれが印刷したものです:

UnFilteredDuringExSummaryOfMeansArrayは次のとおりです。

[['TestID', 'ConditionName', 'FilterType', 'RRMean', 'HRMean', 'dZdtMaxVoltageMean', 'BZMean', 'ZXMean', 'LVETMean', 'Z0Mean', 'StrokeVolumeMean', 'CardiacOutputMean', 'VelocityIndexMean'],
[u'HF101710', 'PreEx10SecondsBEFORE', 'UnfilteredBefore', 0.90670000000000006, 66.257731979420001, 1.8305673000000002, 0.11750000000000001, 0.15120546389880002, 0.26870546389879996, 27.628261216480002, 86.944190346160013, 5.767261352345999, 0.066259118585869997],
[u'HF101710', '25W10SecondsBEFORE', 'UnfilteredBefore', 0.68478571428571422, 87.727887206978565, 2.2965444125714285, 0.099642857142857144, 0.14952476549885715, 0.24916762264164286, 27.010483303721429, 103.5237336525, 9.0682762747642869, 0.085022572648242867],
[u'HF101710', '50W10SecondsBEFORE', 'UnfilteredBefore', 0.54188235294117659, 110.74841107829413, 2.6719262705882354, 0.077705882352917643, 0.15051306356552943, 0.2282189459185294, 26.768787504858825, 111.22827075238826, 12.329456404418824, 0.099814258468417641],
[u'HF101710', '75W10SecondsBEFORE', 'UnfilteredBefore', 0.4561904761904762, 131.52996981880955, 3.1818159523809522, 0.074714285714290493, 0.13459344175047619, 0.20930772746485715, 26.391156337028569, 123.27387909873812, 16.214243779323812, 0.1205685359981619]]

5行13列の行列のように見えますが、スクリプトでさまざまなデータを実行すると、行の数は変わります。これに追加するのと同じデータを使用します。

編集2:ただし、スクリプトはエラーをスローしています。だからあなたの考えがここで起こっている問題を説明しているとは思いません。ありがとう、結構です。他のアイデアはありますか?


編集3:

参考までに、この問題のコード行を置き換えると、

    RRDuringArray = p.array(UnFilteredDuringExSummaryOfMeansArray,dtype=p.float64)[1:,3]

これを代わりに:

    RRDuringArray = p.array(UnFilteredDuringExSummaryOfMeansArray)[1:,3]

次に、スクリプトのそのセクションはエラーをスローせずに正常に動作しますが、次のコード行はさらに下にあります。

p.ylim(.5*RRDuringArray.min(),1.5*RRDuringArray.max())

このエラーをスローします:

File "mypath\mypythonscript.py", line 3631, in CreateSummaryGraphics
  p.ylim(.5*RRDuringArray.min(),1.5*RRDuringArray.max())
TypeError: cannot perform reduce with flexible type

したがって、matplotlibでylimを使用できるようにするには、データ型を指定する必要がありますが、データ型を指定すると、この投稿を開始したエラーメッセージがスローされます。


誰かがこの質問から無関係な詳細をすべて削除したいですか?
Chris_Rands

回答:


254

あなたが私たちに示したコードから、私たちに言えることは、多次元配列のような形ではないリストから配列を作成しようとしているということだけです。例えば

numpy.array([[1,2], [2, 3, 4]])

または

numpy.array([[1,2], [2, [3, 4]]])

入力リストの形状は多次元配列に変換できる(一般化された)「ボックス」ではないため、このエラーメッセージが表示されます。したがって、おそらくUnFilteredDuringExSummaryOfMeansArray異なる長さのシーケンスが含まれています。

編集:このエラーメッセージの別の考えられる原因は、型の配列の要素として文字列を使用しようとしていることfloatです:

numpy.array([1.2, "abc"], dtype=float)

それはあなたがあなたの編集に従って試みているものです。文字列と浮動小数点数の両方を含むNumPy配列が本当に必要な場合objectは、配列が任意のPythonオブジェクトを保持できるようにするdtype を使用できます。

numpy.array([1.2, "abc"], dtype=object)

あなたのコードが何を達成するかを知らなければ、これがあなたの望んでいることかどうか判断できません。


1
ありがとう、でもその答えだとは思いません。上記のエラーがスローされたときに配列の内容を追加しました。また、メモ帳に貼り付けて1行ずつ確認すると、ボックスのように見えます。他のアイデアはありますか?
MedicalMath 2011年

2
あなたの編集が私の問題を解決したようです。dtype = objectを設定する必要がありました。どうもありがとうございました。
MedicalMath 2011年

この質問は完全に答えられました。
MedicalMath 2011年

別の可能性は、1.9の問題である可能性があり__getitem__ます。ここで指定されているように実装されているオブジェクトのリスト(必ずしもリストではない)を構築する場合:github.com/numpy/numpy/issues/5100
dashesy

47

Python ValueError:

ValueError: setting an array element with a sequence.

それが言うことを正確に意味します、あなたは単一の番号スロットに一連の番号を詰め込もうとしています。さまざまな状況で投げることができます。

1. pythonのタプルまたはリストを渡して、numpy配列要素として解釈する場合:

import numpy

numpy.array([1,2,3])               #good

numpy.array([1, (2,3)])            #Fail, can't convert a tuple into a numpy 
                                   #array element


numpy.mean([5,(6+7)])              #good

numpy.mean([5,tuple(range(2))])    #Fail, can't convert a tuple into a numpy 
                                   #array element


def foo():
    return 3
numpy.array([2, foo()])            #good


def foo():
    return [3,4]
numpy.array([2, foo()])            #Fail, can't convert a list into a numpy 
                                   #array element

2. numpy配列の長さ> 1をnumpy配列要素に詰め込もうとすることにより:

x = np.array([1,2,3])
x[0] = np.array([4])         #good



x = np.array([1,2,3])
x[0] = np.array([4,5])       #Fail, can't convert the numpy array to fit 
                             #into a numpy array element

numpy配列が作成されていますが、numpyは複数値のタプルまたは配列を単一の要素スロットに詰め込む方法を認識していません。それはあなたが与えたものはどれでも単一の数に評価することを期待します、もしそうでなければ、Numpyはシーケンスで配列要素を設定する方法を知らないと応答します。


とても良い説明
Tejas Shetty

15

私の場合、Tensorflowでこのエラーが発生しました。理由は、長さまたはシーケンスが異なる配列をフィードしようとしていたためです。

例:

import tensorflow as tf

input_x = tf.placeholder(tf.int32,[None,None])



word_embedding = tf.get_variable('embeddin',shape=[len(vocab_),110],dtype=tf.float32,initializer=tf.random_uniform_initializer(-0.01,0.01))

embedding_look=tf.nn.embedding_lookup(word_embedding,input_x)

with tf.Session() as tt:
    tt.run(tf.global_variables_initializer())

    a,b=tt.run([word_embedding,embedding_look],feed_dict={input_x:example_array})
    print(b)

そして私の配列が:

example_array = [[1,2,3],[1,2]]

次に、エラーが発生します。

ValueError: setting an array element with a sequence.

しかし、私がパディングする場合:

example_array = [[1,2,3],[1,2,0]]

今それは働いています。


私はpyCUDAを使用していて、誤ってgpuarray要素をnumpy配列に割り当てました。同じエラーが発生しました。
Tirtha R

@Aaditya Ura、そのようなパディングをどのように行うか、あなたは何かを参照できますか?
パリ

7

Numpyで同様の問題が発生している場合、非常に簡単な解決策は次のとおりです。

dtype=object値を割り当てるための配列を定義するときに定義します。例えば:

out = np.empty_like(lil_img, dtype=object)

3
Edit受け入れられた回答の一部とどう違うのですか。
सत्यमेवजयते

魅力のように働いた!
mcagriardic

5

私の場合、問題は別のものでした。私はintのリストのリストを配列に変換しようとしていました。問題は、長さが異なるリストが1つあったことです。証明したい場合は、次のことを行う必要があります。

print([i for i,x in enumerate(list) if len(x) != 560])

私の場合、長さの参照は560でした。


2

私の場合、問題はデータフレームX []の散布図にありました。

ax.scatter(X[:,0],X[:,1],c=colors,    
       cmap=CMAP, edgecolor='k', s=40)  #c=y[:,0],

#ValueError: setting an array element with a sequence.
#Fix with .toarray():
colors = 'br'
y = label_binarize(y, classes=['Irrelevant','Relevant'])
ax.scatter(X[:,0].toarray(),X[:,1].toarray(),c=colors,   
       cmap=CMAP, edgecolor='k', s=40)

もう少し説明がいいでしょう。
Tejas Shetty

1
値のエラーは、n要素の配列(シーケンス)を、floatのみを持つ単一の数値スロットにロードしようとしていることを意味します。したがって、配列要素をシーケンスで設定しようとしています。.toarray()を使用して、シーケンスの配列に拡大します。toarray()はndarrayを返します。
Max Kleiner

0

形状が規則的でないか、要素のデータ型が異なる場合、dtypenp.arrayに渡される引数はのみobjectです。

import numpy as np

# arr1 = np.array([[10, 20.], [30], [40]], dtype=np.float32)  # error
arr2 = np.array([[10, 20.], [30], [40]])  # OK, and the dtype is object
arr3 = np.array([[10, 20.], 'hello'])     # OK, and the dtype is also object

「」


SOへようこそ。この質問は非常に古く、あなたの回答が他の少なくとも1つと重複しているようです。答えが実際には異なる場合は、その方法を説明する詳細をいくつか追加してみてください。
Jens Ehrich
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.