【发布时间】:2019-10-19 17:16:08
【问题描述】:
假设我们有一个秩为 2 的数组 a,其中 n 条目包含 {0,1,2,...,m} 中的整数值。现在对于这些整数中的每一个,我想找到具有此值的a 条目的索引(在以下示例中称为index_i, index_j)。 (所以我正在寻找的是像 np.unique(...,return_index=True) 但对于 2d 数组并且有可能返回每个唯一值的 all 索引。)
一种天真的方法将涉及使用布尔索引,这将导致O(m*n) 操作(见下文),但我只想有O(n) 操作。虽然我找到了解决方案,但我觉得应该有一个内置的方法,或者至少可以简化这一点 - 或者至少可以消除这些丑陋的循环:
import numpy as np
a = np.array([[0,0,1],[0,2,1],[2,2,1]])
m = a.max()
#"naive" in O(n*m)
i,j = np.mgrid[range(a.shape[0]), range(a.shape[1])]
index_i = [[] for _ in range(m+1)]
index_j = [[] for _ in range(m+1)]
for k in range(m+1):
index_i[k] = i[a==k]
index_j[k] = j[a==k]
#all the zeros:
print(a[index_i[0], index_j[0]])
#all the ones:
print(a[index_i[1], index_j[1]])
#all the twos:
print(a[index_i[2], index_j[2]])
#"sophisticated" in O(n)
index_i = [[] for _ in range(m+1)]
index_j = [[] for _ in range(m+1)]
for i in range(a.shape[0]):
for j in range(a.shape[1]):
index_i[a[i,j]].append(i)
index_j[a[i,j]].append(j)
#all the zeros:
print(a[index_i[0], index_j[0]])
#all the ones:
print(a[index_i[1], index_j[1]])
#all the twos:
print(a[index_i[2], index_j[2]])
(请注意,稍后我将需要这些索引进行写访问,即替换存储在数组中的值。但在这些操作之间,我确实需要二维结构。)
【问题讨论】:
-
也许
numpy.argwhere?类似[np.argwhere(a == x) for x in np.unique(a)]..? -
最终输出会是什么样子?考虑到元素的数量可能是可变的,这可能会使寻找删除循环时的事情变得复杂。
-
@ChrisA 谢谢,这与我正在寻找的内容很接近,至少它简化了代码。这样做的问题是您仍然需要
O(n*m)操作,因为您将每个值x与整个输入数组进行比较。 -
@Divakar 理想情况下是索引列表的集合,其中每个列表对应一个值。 (就像我的例子中的
index_i, index_j。) -
温馨提示 - 对发布的解决方案有任何反馈吗?
标签: python arrays numpy indexing