当前位置: 代码迷 >> python >> 二进制图像数据帧到欧几里德坐标
  详细解决方案

二进制图像数据帧到欧几里德坐标

热度:98   发布时间:2023-06-13 13:46:55.0

我希望获取一个图像的数据帧,该图像是False / True的二进制布尔值,并将其转换为数据框为真的坐标数组。

例如,如果index [4]和column [8]为true,则会向数组添加4,8。

IIUC你可以这样做:

In [70]: df
Out[70]:
       a      b      c
0   True  False   True
1   True   True  False
2  False   True   True
3  False   True   True
4   True  False  False
5  False   True  False
6   True  False  False
7  False   True  False
8  False  False   True
9   True  False   True

In [71]: np.dstack(np.nonzero(df.values))[0]
Out[71]:
array([[0, 0],
       [0, 2],
       [1, 0],
       [1, 1],
       [2, 1],
       [2, 2],
       [3, 1],
       [3, 2],
       [4, 0],
       [5, 1],
       [6, 0],
       [7, 1],
       [8, 2],
       [9, 0],
       [9, 2]], dtype=int64)

要么:

In [76]: np.stack(np.nonzero(df.values)).T
Out[76]:
array([[0, 0],
       [0, 2],
       [1, 0],
       [1, 1],
       [2, 1],
       [2, 2],
       [3, 1],
       [3, 2],
       [4, 0],
       [5, 1],
       [6, 0],
       [7, 1],
       [8, 2],
       [9, 0],
       [9, 2]], dtype=int64)

建立:

df = pd.DataFrame(np.random.choice([True, False], (10, 3)), columns=list('abc'))

建立

使用@ MaxU的示例数据帧

df = pd.DataFrame({
        'a': [True, True, False, False, True, False, True, False, False, True],
        'b': [False, True, True, True, False, True, False, True, False, False],
        'c': [True, False, True, True, False, False, False, False, True, True]})

我猜你想要数据框index和'列'的坐标

选项1
stack + mask

s = df.stack()
s[s].index.values

array([(0, 'a'), (0, 'c'), (1, 'a'), (1, 'b'), (2, 'b'), (2, 'c'),
       (3, 'b'), (3, 'c'), (4, 'a'), (5, 'b'), (6, 'a'), (7, 'b'),
       (8, 'c'), (9, 'a'), (9, 'c')], dtype=object)

选项2
只是在np.where位置

np.stack(np.where(df.values)).reshape(-1, 2)

array([[0, 0],
       [1, 1],
       [2, 2],
       [3, 3],
       [4, 5],
       [6, 7],
       [8, 9],
       [9, 0],
       [2, 0],
       [1, 1],
       [2, 1],
       [2, 0],
       [1, 0],
       [1, 2],
       [0, 2]])

选项3
使用np.where返回indexcolumns

r, c = np.where(df.values)
list(zip(df.index[r], df.columns[c]))

[(0, 'a'),
 (0, 'c'),
 (1, 'a'),
 (1, 'b'),
 (2, 'b'),
 (2, 'c'),
 (3, 'b'),
 (3, 'c'),
 (4, 'a'),
 (5, 'b'),
 (6, 'a'),
 (7, 'b'),
 (8, 'c'),
 (9, 'a'),
 (9, 'c')]