3

サイズが 639 × 668 の行列sがあるとします。この行列は完全に -1 の値で構成されています。28X28 のセクション (左上隅など) にアクセスして置換し、その特定の部分行列の周囲に -1 の境界線を残します。そのタスクのために、次のベクトルpを (MATLAB で) 初期化し、セクションにアクセスしました。

>> s = -ones(639, 668);
>> p = 2:29;
>> section = s(p, p); %Size 28X28
>> size(section)

   ans =

   28    28

スライスが同等であると仮定して、Numpy/Python でそのコードを書き直したいと思います。

>>> import numpy as np
>>> s = -np.ones((639, 668))
>>> p = np.arange(1, 29)
>>> section = s[p, p]
>>> section.shape
(1, 28)

この場合、同じベクトルを使用して同じセクションにアクセスすることはできません (numpy のインデックスは 0 に基づいていることに注意してください)。¿MATLAB と同様のプロセスを使用して、numpy でそのセクションにアクセスすることは可能ですか?

前もって感謝します。

4

2 に答える 2

1

のように、リストではなくスライス表記を使用しますa[1:29,1:29]

必要に応じて、をslice使用してオブジェクトを作成し、p = slice(1,29)より多くの matlab の動作を得ることができます。

In [9]: a = -np.ones((10,10))

In [10]: a
Out[10]: 
array([[-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.]])

In [11]: a[1:4,1:4] = 9

In [12]: a
Out[12]: 
array([[-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1.,  9.,  9.,  9., -1., -1., -1., -1., -1., -1.],
       [-1.,  9.,  9.,  9., -1., -1., -1., -1., -1., -1.],
       [-1.,  9.,  9.,  9., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.]])


In [13]: p = slice(1,4)

In [14]: a[p,p]
Out[14]: 
array([[ 9.,  9.,  9.],
       [ 9.,  9.,  9.],
       [ 9.,  9.,  9.]])
于 2013-03-27T21:28:36.063 に答える
1

オブジェクトでやりたいことができsliceます:

>>> p = slice(1, 29)
>>> section = s[p, p]
>>> section.shape
(28L, 28L)

インデックス配列をブロードキャストすると、似たような別の結果が得られます。

>>> p = np.arange(1, 19)
>>> section_bis = s[p[:, None], p]
>>> section_bis.shape
(28L, 28L)

問題は、派手なインデックスを使用したため、元の配列のビューではなく、コピーになっていることです。

>>> section_bis[:] = 0
>>> s
array([[-1., -1., -1., ..., -1., -1., -1.],
       [-1., -1., -1., ..., -1., -1., -1.],
       [-1., -1., -1., ..., -1., -1., -1.],
       ..., 
       [-1., -1., -1., ..., -1., -1., -1.],
       [-1., -1., -1., ..., -1., -1., -1.],
       [-1., -1., -1., ..., -1., -1., -1.]])

しかし:

>>> section[:] = 0
>>>
array([[-1., -1., -1., ..., -1., -1., -1.],
       [-1.,  0.,  0., ..., -1., -1., -1.],
       [-1.,  0.,  0., ..., -1., -1., -1.],
       ..., 
       [-1., -1., -1., ..., -1., -1., -1.],
       [-1., -1., -1., ..., -1., -1., -1.],
       [-1., -1., -1., ..., -1., -1., -1.]])
于 2013-03-27T21:30:09.587 に答える