我有一个由唯一正整数组成的数组/集合,即
>>> unique = np.unique(np.random.choice(100, 4, replace=False))
还有一个包含多个从之前数组中抽样的元素的数组,例如
>>> A = np.random.choice(unique, 100)
我希望将数组A
的值映射到它们在unique
中出现的位置。
目前我找到的最佳解决方案是通过一个映射数组:
>>> table = np.zeros(unique.max()+1, unique.dtype)
>>> table[unique] = np.arange(unique.size)
上述代码为每个元素分配了数组中的索引,因此可以稍后通过高级索引将A
映射:
>>> table[A]
array([2, 2, 3, 3, 3, 3, 1, 1, 1, 0, 2, 0, 1, 0, 2, 1, 0, 0, 2, 3, 0, 0, 0,
0, 3, 3, 2, 1, 0, 0, 0, 2, 1, 0, 3, 0, 1, 3, 0, 1, 2, 3, 3, 3, 3, 1,
3, 0, 1, 2, 0, 0, 2, 3, 1, 0, 3, 2, 3, 3, 3, 1, 1, 2, 0, 0, 2, 0, 2,
3, 1, 1, 3, 3, 2, 1, 2, 0, 2, 1, 0, 1, 2, 0, 2, 0, 1, 3, 0, 2, 0, 1,
3, 2, 2, 1, 3, 0, 3, 3], dtype=int32)
这已经给出了正确的解决方案。但是,如果
unique
中的唯一数字非常稀疏且较大,则此方法意味着创建一个非常大的table
数组,仅用于存储一些数字以供稍后映射。有更好的解决方案吗?
注意:
A
和unique
都是示例数组,不是真正的数组。因此,问题不在于如何生成位置索引,而在于如何高效地将A
的元素映射到unique
中的索引。我想加速numpy中的伪代码如下:B = np.zeros_like(A)
for i in range(A.size):
B[i] = unique.index(A[i])
(假设上述伪代码中的
unique
是一个列表。)
unique
没有被排序,那么可以使用sorter
对其进行排序。 - Divakar