2016-03-24 4 views
1

元の質問

配列の要素の一部を割り当てようとすると、非常に奇妙なエラーメッセージが表示されます。私は、スライスとインデックスの組み合わせを使用しています。次の簡単な例を参照してください。高度な混合インデックスを使用したサブ配列の割り当て

とValueError:形状の不一致:形状(3,4)の値アレイは形状の割り出し結果にブロードキャストすることができなかった(3,4)

import scipy as sp 

a = sp.zeros((3, 4, 5)) 
b = sp.ones((4, 5)) 

I = sp.array([0, 1, 3]) 

b[:, I] = a[0, :, I] 

このコードはValueError以下提起します -

スライスおよび配列の組み合わせを使用する場合は注意してください

をフォローアップ。整数のgithubの上で指摘したように:

x = rand(3, 5, 7) 

print(x[0, :, [0,1]].shape) 
# (2, 5) 

print(x[0][:, [0,1]].shape) 
# (5, 2) 

これはnumpyのが動作するように設計された方法ですが、それは、x [0] [:, I]こと、それにもかかわらず少し混乱して、0 [xと同じではありません:私]。これが私のコードでx [0] [:, I]を使うことを選ぶことを望む振舞いなので、ここで

+1

はルックス:う '[0,1 4] '実際には' [0,1,4] '(1から4までのカンマで)ですか? – heltonbiker

答えて

1

質問のコードをコピーする際に、いくつかの誤りがあるようです。

しかし、私は、インデックスの既知の問題があります疑う:

In [73]: a=np.zeros((2,3,4)); b=np.ones((3,4)); I=np.array([0,1]) 

I 2の要素を作成します。索引付けbは、予想される(3,2)形状を与えます。スライスから3行、Iインデックス

In [74]: b[:,I].shape 
Out[74]: (3, 2) 

から2列が、3D aで我々は転置を取得します。

In [75]: a[0,:,I].shape 
Out[75]: (2, 3) 

および割り当ては、:秒からI最初によって定義された2要素の寸法、及び3要素を入れているエラー

In [76]: b[:,I]=a[0,:,I] 
... 
ValueError: array is not broadcastable to correct shape 

を生成します。これは先に議論した混合索引の場合で、バグの問題もあります。 (私はそれらを見なければならないでしょう)。

おそらく、新しいnumpy(またはscipy)を使用していて、別のエラーメッセージが表示されている可能性があります。

2つの配列またはリストでインデックスを作成し、途中でスライスすると、スライスが最後に配置されることが記録されています。

In [86]: a[[[0],[0],[1],[1]],:,[0,1]].shape 
Out[86]: (4, 2, 3) 

a[0,:,[0,1]]でも同じことが起こっています。しかし、このようにすべきではないという良い議論があります。あなたがタイプミスを持っているよう

固定するため、あなたが値を移調、または変更される可能性がインデックス

In [88]: b[:,I]=a[0:1,:,I] 

In [90]: b[:,I]=a[0,:,I].T 

In [91]: b 
Out[91]: 
array([[ 0., 0., 1., 1.], 
     [ 0., 0., 1., 1.], 
     [ 0., 0., 1., 1.]]) 

In [92]: b[:,I]=a[0][:,I] 

https://github.com/numpy/numpy/issues/7030

https://github.com/numpy/numpy/pull/6256

+0

ありがとうございました。 。 。インデックスリストの途中のスライスが最後の次元にプッシュされます。 –

1

私はインデックス[0,1,4]と、このエラーが出る:

IndexError: index 4 is out of bounds for axis 2 with size 4 

そのサイズ4が示唆する一方で、最大の指数は3

EDITなり、4がインデックスとして使用されている値を示唆:今度は[0, 1, 3]に変更しました。ここでうまく動作しています。

EDIT:あなたの現在のコードで、私は同じエラーを取得しますが、私は配列そのものを印刷するとき、彼らは横方向の形状を持っている:あなたは、カンマが欠けているように見えるすべての

print b[:, I] 
print a[0, :, I] 

[[ 1. 1. 1.] 
[ 1. 1. 1.] 
[ 1. 1. 1.] 
[ 1. 1. 1.]] 

[[ 0. 0. 0. 0.] 
[ 0. 0. 0. 0.] 
[ 0. 0. 0. 0.]] 
1

ファースト6行目:

:第二に

I = sp.array([0,1,4]) 

、私はAとBの両方が4の最大寸法を有しているので、私はあなたが望むかもしれない疑いが、私ははIndexErrorを高めるために、配列内の値4を期待しますこれらの変更を行っ

は私のためのプログラムを実行し、私はとBを得た:

私はあなたが望むものである疑いがある
[[ 0. 0. 1. 0.] 
[ 0. 0. 1. 0.] 
[ 0. 0. 1. 0.]] 

+0

このテストケースが実際に実行されていることに気付きましたので、私はサンプルを変更しました。何らかの理由で、アレイサイズが小さくなっても、私が経験しているエラーは増えませんでした。 –

関連する問題