3

これはnumpyを使用しています。これは、必要なものに興味深いことに近いものです。サブマトリックスビューdを更新すると、バッキングマトリックスaを更新できます。

a = array([[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])

print a

array([[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])

d = a[1:4,1:4]

print d

array([[0, 1, 0],
[1, 0, 0],
[0, 0, 0]])

d[1,1]=9

print a

array([[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 9, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])

これは素晴らしいです、私が望んでいたように、9はバッキング配列aに表示されます。

OK、これが摩擦です。代わりに、numpyの部分行列ビュー配列dまたはdのビューddを、2Dではなく1D行列として定式化する必要がある場合、どのように行いますか?以下はそれを行うことができません。

dd = d.reshape(9)

print dd

array([0, 1, 0, 1, 9, 0, 0, 0, 0])

dd[7]=7

print dd

array([0, 1, 0, 1, 9, 0, 0, 7, 0])

print a

array([[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 9, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])

私は7がバッキングアレイに表示されるのを見たいと思っていました。d部分行列ビューを2Dに制限する必要はないことに注意してください。そもそも、d部分行列ビューの1D定義は、そのようなものが存在する場合、完全に細かい定式化になります。

4

3 に答える 3

3

flatこの方法が役立つと思うかもしれません。jterraceがすでに指摘しているように、使用するメモリはd連続していないためd、通常の方法で再形成することはできません。ただし、このflatメソッドは配列を返しませんnumpy.flatiter。Pythonイテレータのようなオブジェクトを返しますが、通常の配列と同じように、インデックス付きのアクセスと割り当てを許可します。

>>> d = a[1:4,1:4]
>>> dd = d.flat
>>> dd[7] = 7
>>> a
array([[0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0],
       [0, 1, 0, 0, 0],
       [0, 0, 7, 0, 0],
       [0, 0, 0, 0, 0]])
于 2012-08-12T16:26:34.247 に答える
3

ビューを作成しようとしている場合は、.shapeを呼び出すのではなく、属性に割り当てる必要があります.reshapenumpy.reshapeのNotesセクションを読むと、コピーせずに配列のビューを作成できるとは限らないことがわかります。.shape代わりに次のコードを実行するとどうなるかを見てください。

>>> import numpy as np
>>> a = np.array([[0, 0, 0, 0, 0],
... [0, 0, 1, 0, 0],
... [0, 1, 0, 0, 0],
... [0, 0, 0, 0, 0],
... [0, 0, 0, 0, 0]])
>>> d = a[1:4,1:4]
>>> d.shape
>>> d.shape = (9,)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: incompatible shape for a non-contiguous array

これが機能しない理由は、作成したビュースライスが連続していないためです。numpyが基盤となるストレージメカニズムで特定のデータを効率的に維持できない場合、.reshape関数は代わりにコピーを作成します。

于 2012-08-12T15:13:36.003 に答える
2

あなたが抱えている問題は、 -の再形成されたビューではなく、 のコピーdd = d.reshape(9)作成していることですdd

試す:

d = a[1:4, 1:4] # updates reflected in a
d[1, 1] = 9     # updates reflected in a
d.itemset(7, 7) # 7th element regardless of dimensions
# or for multiple updates
np.put(d, [7, 3], [7, 9999]) 
print a
于 2012-08-12T15:29:54.067 に答える