逻辑索引一个numpy数组后保持2D结构

时间:2019-04-15 16:07:54

标签: python numpy

我正在跟踪一个动态变化的遮罩,该遮罩会使用一些输入偏移进行滚动。此掩码存储的值确定了我可以信任其他形状相同的数组中的值。掩码如何在每次迭代中更改的示例如下。我有大量的逻辑检查,可根据移位的x和y值等于0还是正数或负数来确定如何将蒙版的滚动部分设置为零。在这里,我只是为了清楚起见对所有内容进行了硬编码。

import numpy as np
mask = np.full((8,8), 10)

#Iteration 1
mask = np.roll(mask, (0, 1), axis = (0,1))
mask[:, :1] = 0
#logical indexing happens here
mask += 1
print (mask)

#Iteration 2
mask = np.roll(mask, (1, 0), axis = (0,1))
mask[:1, :] = 0
#logical indexing happens here
mask +=1
print (mask)

#Iteration 3
mask = np.roll(mask, (2, -1), axis = (0,1))
mask[:, -1:] = 0
mask[:2, :] = 0
#logical indexing happens here
mask +=1
print (mask)

在每次迭代之后,在将掩码增加1之前,我需要索引并拉出掩码大于某个阈值(在这种情况下为10)的第二个数组的值。由于我正在滚动和设置值,因此我始终知道可以将满足此条件的蒙版部分广播到2d数组中。下面是我现在正在做的简化示例,其中arr2是一个扁平数组。

import numpy as np

arr1 = np.arange(0, 64, 1).reshape((8,8))
mask = np.full((8,8), 10)
mask[:, 0] = 0

arr2 = arr1[mask >= 10]

如何将arr2保留为2d数组,其中掩码大于设置的阈值?

我不知道先验会对遮罩施加什么偏移,因此我必须依靠遮罩中的值来确定所得数组的形状。我的数组比该示例大得多,并且偏移量在-5到5之间,所以我知道我将无法接近将整个数组设置为低于阈值。这个想法是在大约10次迭代之后,数组的某些部分再次变得可信,并且在逻辑索引之后可能是有用的信息。

1 个答案:

答案 0 :(得分:0)

答案是可以解决的,因为它已经在我脑海里隐隐现出了一段时间了,所以很明显。基本上,因为我知道结果区域将是正方形,所以我可以仅在每个索引满足我条件的行和列上进行计数。因此,从前面的示例继续进行,我只需添加几行以确定行和列中有多少个值满足我的条件。

import numpy as np
#Initializing array
arr1 = np.arange(0, 64, 1).reshape((8,8))
#mask array
mask = np.full((8,8), 10)

#Setting some rows and cols to zero to simulate my roll functionality
mask[:, 0] = 0
mask[:2, :] = 0

#Summing across a row and col where condition is met
sizex = np.sum(mask[4, :] >= 10)
sizey = np.sum(mask[:, 4] >= 10)

#Using the mask to index into the original array and reshaping
arr2 = arr1[mask >= 10].reshape((sizey, sizex))