首页 > 解决方案 > 从 numpy 数组中获取坐标

问题描述

所以也许这是一个关于 numpy 的基本问题,但我不知道该怎么做,所以可以说我有一个像这样的 2D numpy 数组

import numpy as np

arr = np.array([[  0., 460., 166., 167., 123.],
                [  0.,   0.,   0.,   0.,   0.],
                [  0.,  81.,   0.,  21.,   0.],
                [  0., 128.,  23.,   0.,  12.],
                [  0.,  36.,   0.,  13.,   0.]])

我想要子数组的坐标

[[0., 21,.  0.],
 [23., 0., 12.],
 [0., 13.,  0.]]

我尝试切片我的原始数组并使用np.argwhere这样的查找坐标

newarr = np.argwhere(arr[2:, 2:] != 0)

#output
#[[0 1]
# [1 0]
# [1 2]
# [2 1]]

这确实是来自子数组的坐标,但我期待与我的原始数组对应的坐标,所需的输出是:

[[2 3]
 [3 2]
 [3 4]
 [4 3]]

如果我使用np.argwhere原始数组,我会得到一堆我不需要的坐标,所以我无法弄清楚如何获得我需要的东西,任何帮助或者如果你能指出我正确的方向将是太好了谢谢!

标签: pythonarraysnumpy

解决方案


假设原点位于矩阵的左上角,矩阵本身位于笛卡尔空间的第四象限。水平轴具有列索引,垂直轴向下具有行索引。

您将看到整个子矩阵在(2,2)坐标上移动了原点。因此,当您获得的坐标相对于原点上的子矩阵时,要(2,2)再次将它们恢复,只需添加(2,2)整个元素:

>>> np.argwhere(arr[2:, 2:] != 0) + [2, 2]
array([[2, 3],
       [3, 2],
       [3, 4],
       [4, 3]])

对于其他示例:

>>> col_shift, row_shift = 3, 2

>>> arr[row_shift:, col_shift:]
array([[21.,  0.],
       [ 0., 12.],
       [13.,  0.]])

>>> np.argwhere(arr[row_shift:, col_shift:] != 0) + [row_shift, col_shift]
array([[2, 3],
       [3, 4],
       [4, 3]])

对于完全内部的子矩阵,您可以绑定列和行:

>>> col_shift, row_shift = 0, 1
>>> col_bound, row_bound = 4, 4

>>> arr[row_shift:row_bound, col_shift:col_bound]
array([[  0.,   0.,   0.,   0.],
       [  0.,  81.,   0.,  21.],
       [  0., 128.,  23.,   0.]])

>>> np.argwhere(arr[row_shift:row_bound, col_shift:col_bound] != 0) + [row_shift, col_shift]
array([[2, 1],
       [2, 3],
       [3, 1],
       [3, 2]])

推荐阅读