gpt4 book ai didi

python - Numpy:如何快速替换矩阵中的相等值?

转载 作者:太空宇宙 更新时间:2023-11-03 11:13:26 25 4
gpt4 key购买 nike

假设我们有一个 2 阶数组 a,其中 n 条目包含 {0,1,2,...,m} 中的整数值。现在,对于这些整数中的每一个,我想找到具有该值的 a 条目的索引(在以下示例中称为 index_i, index_j )。 (所以我正在寻找的是像 np.unique(...,return_index=True) 但是对于二维数组并且有可能返回每个的 all 索引独特的值(value)。)

天真的方法会涉及使用 bool 索引,这会导致 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]])

Try it online!

(请注意,稍后我将需要这些索引来进行写访问,也就是说,用于替换存储在数组中的值。但是在这些操作之间我确实需要 2d 结构。)

最佳答案

这是一个基于 sorting 的方法,目的是在迭代时进行最少的工作以保存为字典,其中键是唯一元素,值是索引 -

shp = a.shape
idx = a.ravel().argsort()
idx_sorted = np.c_[np.unravel_index(idx,shp)]
count = np.bincount(a.ravel())
valid_idx = np.flatnonzero(count!=0)
cs = np.r_[0,count[valid_idx].cumsum()]
out = {e:idx_sorted[i:j] for (e,i,j) in zip(valid_idx,cs[:-1],cs[1:])}

示例输入、输出-

In [155]: a
Out[155]:
array([[0, 2, 6],
[0, 2, 6],
[2, 2, 1]])

In [156]: out
Out[156]:
{0: array([[0, 0],
[1, 0]]), 1: array([[2, 2]]), 2: array([[0, 1],
[1, 1],
[2, 0],
[2, 1]]), 6: array([[0, 2],
[1, 2]])}

如果序列中的所有整数都包含在数组中,我们可以稍微简化它 -

shp = a.shape
idx = a.ravel().argsort()
idx_sorted = np.c_[np.unravel_index(idx,shp)]
cs = np.r_[0,np.bincount(a.ravel()).cumsum()]
out = {iterID:idx_sorted[i:j] for iterID,(i,j) in enumerate(zip(cs[:-1],cs[1:]))}

关于python - Numpy:如何快速替换矩阵中的相等值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56439404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com