假设我们有一个秩2数组a
,其中n
项在{0,1,2,...,m}
中包含整数值。现在,对于这些整数中的每一个,我想找到具有这个值的a
项的索引(在下面的示例中称为index_i, index_j
)。(所以我要找的是np.unique(...,return_index=True)
但是对于2d数组,并且可以返回每个唯一值的所有索引。)
一个简单的方法是使用布尔索引,这将导致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]])
(请注意,我将在以后的写访问中需要这些索引,即替换存储在数组中的值。但在这些操作之间,我确实需要使用2d结构。)
这是一个基于
sorting
的字典,其目的是在迭代以保存为字典时进行最少的工作,其中键是唯一的元素,值是索引-样本输入,输出-
如果序列中的所有整数都包含在数组中,我们可以将其简化一点-
相关问题 更多 >
编程相关推荐