2012-11-19 159 views
6

如何根据索引公式“雕刻”或遮罩2D numpy数组?我不在乎元素值是什么,只是它在数组中的位置。通过索引雕刻2D numpy数组

例如,给定一个的m×m阵列,如何抽取为地址符合

for i in range(0,m): 
    for j in range(0,m): 
     if j-i-k>=0: 
      A[i,j] = 1 
     elif j-p-k>=0: 
      A[i,j] = 1 
     elif i-k>=0: 
      A[i,j] = 1 
     else: 
      A[i,j] = 0 
     j=j+1 
    i=i+1 

其中

k和p为任意的栅栏的所有元素

假设

k<m 
p<m 

这最终看起来像一个对角切片+水平切片+ a垂直切片。没有上面的for循环可以完成吗?

+0

上NEW_DATA =数据[面具] @tcaswell,用我的“为”创造面具“删除”一些行和列更多的问题,在某种程度上给我留下了一个向量,而不是原始data.shape的数组。为什么?我怎样才能防止这一点? – Hokiexterra

回答

1
xdim,ydim = data.shape 
k = 2 
a, b = np.meshgrid(range(ydim),range(xdim)) 
mask = (b - a -k) < 0 

new_data = data[mask] 

new_data2 = np.array(data) # to force a copy 
new_data2[~mask] = 0 

new_data是因为掩蔽处理(完成这种方式)变平的阵列的载体。你正在选择一个不能用数组表示的破旧的形状。如果您只是想将非选择的值设置为0,请使用new_data2。

+0

关于 – Hokiexterra

+0

@ user1836722的更多问题请参阅编辑。 – tacaswell

+0

谢谢,我会试试! – Hokiexterra

3
In [1]: import numpy as np 

In [2]: k = 2 

In [3]: i, j = np.ogrid[0:5,0:5] 

In [4]: mask = (j-i-k < 0) 

In [5]: mask 
Out[5]: 
array([[ True, True, False, False, False], 
     [ True, True, True, False, False], 
     [ True, True, True, True, False], 
     [ True, True, True, True, True], 
     [ True, True, True, True, True]], dtype=bool) 

In [6]: mask.shape 
Out[6]: (5, 5) 

In [7]: mask.dtype 
Out[7]: dtype('bool') 
1

下面是使用np.indices另一种方式:

>>> import numpy as np 
>>> a = np.arange(90).reshape(10,9) 
>>> b = np.indices(a.shape) 
>>> k = 2 
>>> i = b[1] - b[0] - k 
>>> a[i < 0] 
array([ 0, 1, 9, 10, 11, 18, 19, 20, 21, 27, 28, 29, 30, 31, 36, 37, 38, 
    39, 40, 41, 45, 46, 47, 48, 49, 50, 51, 54, 55, 56, 57, 58, 59, 60, 
    61, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 
    79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89]) 
+0

+1,因为我学到了一些东西 – tacaswell