2011-08-28 8 views
6

使用:今numpyの:配列代入の問題私はndarrayためのnumpyのでは、次の不可解な行動やカスタムDTYPEを見つけたカスタムDTYPE

import numpy as np 

# Make a custom dtype with a single triplet of floats (my actual dtype has other 
# components, but this suffices to demonstrate the problem. 
dt = np.dtype([('a', np.float64, 3)]) 

# Make a zero array with this dtype: 
points = np.zeros((4, 4), dtype=dt) 

# Try to edit an entry: 
points[0][0]['a'] = np.array([1, 1, 1]) 

print points[0][0]['a'] 

は、これが含むものとして戻ってくるではない[1。 1. 1.]私が期待するように、代わりに[1。 0. 0.]、第1の座標上でのみ代入を実行する。割り当てを座標通りに実行することでこの問題を回避することができますが、完全割り当てがこの場合のデフォルトの動作であることが必要な場合は不要です。

ここで何が起こっているかについてのご意見はありますか?

答えて

2

あなたのメソッドが動作する場合は、ポイントを割り当てるために多くの方法があります:ポイント[0,0] [ 'A']は配列であるため、

points[0,0]['a'][:] = np.array([1, 1, 1]) 

points[0][0]['a'][:] = np.array([1, 1, 1]) 

かは、配列の内容を変更する場合は、索引を使用します。

+0

私が探していたもの、ありがとう。 –

3

points['a'][0][0] = np.array([1, 1, 1])のようにインデックスの順序を変更すると、それは私のためにうまくいきます(Python 2.6.5、Ubuntu 10.04でnumpy 1.3.0)。私はなぜそれが分かったのかと思う。

+0

私のためにも動作します。私が本当にやりたかったのは、次のようなものです: p = [0] [0] p ['a'] = np.array([1,1]) その他の操作必要に応じてpでオンにします。 –

+0

@Tim:AFAIK、まず最初に名前付き列を指定してから、数値インデックスを取得するだけです。こうして、ポイント['a'] [0]またはポイント[0] ['a'](PODのdtype-ed配列で機能する)のいずれかを書く能力は、私には無料のランチのように感じます。 –

関連する問題