将 numpy inidces 转换为 (N*M) x 2 坐标数组

Convert numpy inidces to (N*M) x 2 array of coordinates

我正在尝试获取一个数组,其中包含 N x M 数组 data 中每个项目的索引作为 (N*M) x 2 格式的坐标,这样数组的第一列包含行索引,第二列包含 data 的列索引。结果数组的长度将是 N*M,因此 data 中的每个项目都是一行。或者,具有坐标信息的元组列表也足够了。

在:

    0   1   2
  -------------
0 | a | b | c |
1 | e | f | g |
2 | h | i | j |
  -------------

输出:

array([0, 0],
      [0, 1],
      [0, 2],
      [1, 0],
      [1, 1],
      [1, 2],
      ...   )

不幸的是,我只能找到进行相反转换的人的问题。我的最终目标是将这个数组输入 scipy.spatial.distance.cdist() 以获得每个点与其他点的距离。我正在处理 [(X,Y) -> Z] 栅格数据,所以我不能在像元值 as it would typically be used 上使用 cdist。我是 numpy 的新手,所以这有点让人头疼。我研究了 np.meshgrid、np.column_stack 和 np.unravel_index,但无法使它们与 np.indices.

的输出一起使用

我认为你可以做到:

[*zip(*np.where(np.ones_like(a)))]

输出:

[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

你可以使用 list comprehension.

M = 3
N = 4

[(i, j) for i in range(N) for j in range(M)]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2), (3, 0), (3, 1), (3, 2)]

您可以使用 unravel_index 和数据的形状,它适用于单个整数或整数数组。在你的情况下,你可以在一行中得到它:

np.array(np.unravel_index(np.arange(data.size),data.shape)).T