2013-03-27 73 views
3

假設我們有一個矩陣S按668大小639的,該矩陣是完全由-1值組成。我們想要訪問並替換28X28的一部分(例如,左上角),在該特定的子矩陣周圍留下-1的邊界。對於這項任務我們已經初始化以下矢量p(在MATLAB中),然後訪問部分:使用載體作爲指標切片numpy的矩陣

>> 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中訪問該部分?

在此先感謝。

回答

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.]]) 
1

你想用slice notation,如a[1:29,1:29],而不是一個列表。

如果需要,可以使用p = slice(1,29)創建一個slice對象以獲得更多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.]])