在numpy ndarray中查找邻居

1 投票
2 回答
2425 浏览
提问于 2025-04-18 17:25

我遇到了一个问题,我有一个numpy的ndarray数组。这个数组可以是二维的,也可以是三维的,这取决于输入的数据。我想要做的是获取每个样本在每个轴上的“前一个”邻居。所以在二维情况下,假设有这样一个数组:

1 2 3 4
5 6 7 8
4 3 2 1

我只需要那些实际上有有效“前一个”邻居的值的索引(也就是说,不包括顶部和左边的边界项)。所以这应该返回我一些像这样的结果:

[[0, 1], [1, 0]], [[1, 1], [2, 0]], [[2, 1], [3, 0]] # corresponding to 6, 7, 8 entries
[[0, 2], [1, 1]], [[1, 2], [2, 1]], [[2, 2], [3, 1]] # corresponding to 3, 2, 1 entries

基本上只考虑子数组。

6 7 8
3 2 1

另外,如果是三维数组,那么还有一个轴,但规则类似,也就是只获取有效条目的子数组。我想用这些索引来操作原始数组中的条目。不过,我不知道怎么高效地生成这些索引,而不需要在ndarray的轴上进行循环(而且这个轴的数量也不是固定的)。

2 个回答

0

考虑一下你的数据是这样的:

import numpy as np
data = np.array([[1, 2, 3, 4],
                 [5, 6, 7, 8],
                 [4, 3, 2, 1]])

如果我理解正确的话,使用切片(slicing)可以得到你需要的结果,也就是:

>>> data[1:, 1:]
array([[6, 7, 8],
       [3, 2, 1]])

因此,如果有效的前一个邻居意味着这些项目的上面和左边都有邻居,你只需对数组的每个维度应用相同的切片 1:。在三维数据中,可以写成 data[1:, 1:, 1:] 等等。

0

好的,我搞明白了。在我的情况下,我可以简单地使用numpy的索引。所以可以这样写:

import numpy as np
i = np.indices(x-2 for x in data.shape)

然后我可以这样使用它:

data[i[0], i[1], i[2]...]

撰写回答