反转 numpy where 坐标

Reversing numpy where coordinate

objective是提取2D数组中等于1的单元格所在的坐标

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

这里的坐标比常规的

flip
8
7
6
5
4
3
2
1
0

0  1 2 3 4 5 6 7 8

因此,对于上面的 2D 数组, 单元格等于 1 的输出是

[(0, 8),(2,4),(3,8)]

我很好奇如何通过考虑这种类型的坐标来调整 np.where

简单

cor=np.array(np.where(arr==1)).T

正如预期的那样,结果会与我预期的不同。

上面的数组可以重现

arr=np.zeros((9,9))
arr[0,0]=1
arr[4,2]=1
arr[0,3]=1 

备注,顺序不重要,如

[(0, 8),(2,4),(3,8)] 等同于 [(8, 0),(4,2),(8,3)]

您可以在轴 0 上使用 numpy 翻转来翻转数组以获取您的坐标。

arr = np.flip(arr, axis=0)
cor = np.array(np.where(arr==1))

函数 np.where 用于二维数组 returns Tuple(np.ndarray, np.ndarray) 其中元组的第一个条目包含所有行索引,第二个条目包含所有列索引。所以如果你想索引转置数组你必须交换元组条目:

indices = np.where(condition)[::-1]

如果你想将坐标格式转换为二元组列表,你可以这样做:

indices = [(n_rr, c) for r, c in zip(np.where(condition))]

编辑: 经过澄清,我现在明白rpb要改变索引的原点,让第零行变成最后一行等等。此外,坐标需要以每个找到的条目的 2 元素元组的格式。

import numpy as np

arr=np.zeros((9,9))
arr[0,0]=1
arr[4,2]=1
arr[0,3]=1 
print(arr)
print(np.where(arr==1.)[0])

n_rows = arr.shape[0]
indices = [(n_rows - 1 -r, c) for r, c in zip(*np.where(arr==1.))]
print(indices)
>>> [(8, 0), (8, 3), (4, 2)]