2011-11-09 27 views
3

我有一個很大的2D numpy數組,我知道一對代表數組的一個元素的索引。我想設置這個元素和周圍的20×20面積等於零;我曾嘗試使用切片技術:在numpy數組中圍繞已知索引(x,y)切片20×20區域

s = array[x:10, y:10] 
s == 0 

但是,儘管先前定義了x和y,但這是'無效切片'。

我將不勝感激任何關於如何才能完成這一任務的建議,因爲我是Python新手。

回答

0

我相信你的意思是array[x:x+10,y:y+10]

+0

謝謝,我試過了,它導致以下錯誤; TypeError:只能連接列表(不是「int」)到列表 –

+0

什麼是x和y?我認爲他們的整數表示頂部/左側角點索引?如果你已經有x和y像beg/end index那樣,你需要'array [x [0]:x [1] + 1,y [0]:y [1] +1]''。還有其他答案指出,上述soln捕獲10x10個子陣列。 – yosukesabai

3
my_array[x - 10:x + 10, y - 10:y + 10] = 0 

s = my_array[x - 10:x + 10, y - 10:y + 10] 
s[:] = 0 
+0

TypeError:不支持的操作數類型爲 - :'list'和'int',儘管這看起來是正確的切片方法 –

+1

@CandaceAdams:然後'x'或'y'是一個列表而不是一個整數。 –

0

您選擇陣列A的多個元素與A[start:stop]其中startstop是從零開始的索引。
對於2D陣列也適用:A[start1:stop1, start2:stop2]

用下面的腳本

import numpy as np 

A = np.ones((5,5)) 

A看起來像

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

A[1:4,1:4] = 0 

這個你

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

請注意,對於以您的x,y座標爲中心的零塊,它必須具有奇數尺寸。例如,零的在以下的塊不居中的座標x,y = 4,6,但是,從中心座標該小區的,即X,Y = 4.5,5.5:

import numpy 

a = numpy.ones((10,10)) 
x,y = 4,6 
s = 2 
a[x - s: x + s, y-s: y + s] = 0 

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

而這一個是:

a = numpy.ones((10,10)) 
x,y = 4,6 
s = 2 
a[x - s: x + s + 1, y-s: y + s + 1] = 0 
print a 

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

如果腳本是用於基於像素的圖像處理,這可能是一個重要的區別。

相關問題