在2d布尔值列表(Python)中找到最左边和最右边的单元格

时间:2019-01-25 20:53:37

标签: python arrays numpy

我有一个二维数组(28 x 28),具有布尔值。

array([[False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False,
        False],
       [False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False,
        False],
       [False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False,
        False],
       [False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False,
        False],
       [False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False,  True,  True,
         True, False, False, False, False, False, False, False, False,
        False],
       [False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False,  True,  True,  True,
         True,  True, False, False, False, False, False, False, False,
        False],
       [False, False, False, False, False, False, False, False, False,
        False, False, False, False, False,  True,  True,  True,  True,
         True,  True, False, False, False, False, False, False, False,
        False],
       ...

这代表一个数字的图像。为了拉伸此图像,以使墨水像素的水平和垂直范围处于框的整个水平/垂直范围。

以下是我要采取的步骤:

1. Find the leftmost (x_min) and the rightmost (x_max) pixels that have ink (after thresholding). 
2. Find the topmost (y_min) and bottom-most (y_max) pixels similarly. 
3. Find the centerpoint (x,y) by taking the mean of x_min and x_max and y_min and y_max respectively. 
4. Now, the 20x20 bounding is defined as img[y_center-10 : y_center + 10, x_center-10:x_center+10]

我尝试以天真的方式来做Step 1,只是迭代所有像素,但是我知道那不是最好的方式。找到最左边和最右边的像素True的最佳方法是什么?

3 个答案:

答案 0 :(得分:0)

您可以使用函数索引,该函数返回您搜索的值的第一个索引:

例如

array = ([False, False, True, True, False])
print(array.index(True))

返回

2

您可以通过添加以下内容来反转数组以找到最后一个数组:

array.reverse();
print(array.index(True))

返回哪个

1

但是,反向操作非常昂贵,可以满足您的需求。

答案 1 :(得分:0)

这对您有用吗?并非最有效,但可行。 想法是删除全为False的行和列,这样您就可以得到“裁剪的”数字。

import pandas as pd

img = np.array([[False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False,
        False],
       [False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False,
        False],
       [False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False,
        False],
       [False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False,
        False],
       [False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False,  True,  True,
         True, False, False, False, False, False, False, False, False,
        False],
       [False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False,  True,  True,  True,
         True,  True, False, False, False, False, False, False, False,
        False],
       [False, False, False, False, False, False, False, False, False,
        False, False, False, False, False,  True,  True,  True,  True,
         True,  True, False, False, False, False, False, False, False,
        False]])

img = pd.DataFrame(img)
img.replace(False,np.nan, inplace = True)
newimage = img.dropna(axis = 0, how = 'all')
newimage = newimage.dropna(axis = 1, how = 'all')
newimage.T.values

答案 2 :(得分:0)

array = [[False, False, False, False],
         [False, False, False, False],
         [True , False, False, False],
         [False, False, False, False]]

print('left: ')
print(min([x.index(True) if True in x else 100 for x in array]))

print('right: ')
print(min([x[::-1].index(True) if True in x else 100 for x in array]))

print('top')
print([any(x) for x in array].index(True))

print('bottom')    
print([any(x) for x in array[::-1]].index(True))

打印

left: 
0
right: 
3
top
2
bottom
1

旁注:

  • 万一连续都没有True,我会在左/右使用100。
  • 如果整个矩阵中根本没有True值,则顶部和底部的条件必须稍作更改。
  • ::-1以相反的顺序迭代列表
  • any检查是否存在非0 /空/ False值。
  • min检查列表的最小值
  • [...]被称为列表理解,如果您想了解更多信息

有了您的价值观,我得到了:

left:
14
right:
8
top:
4
bottom:
0