创建在 2D numpy 数组中充当分组样式查找的字典的最快方法?
Fastest way of creating a dictionary which acts as a group-by style look-up in a 2D numpy array?
假设我有一个 2D numpy 数组,其值对应于一个标签或 class。例如,如果
A = [[0, 0, 1, 1], [1, 1, 1, 0]
,则位置 (0, 0), (0, 1), (1, 3)
对应于 class '0',(0, 2), (0, 3), (1, 0), etc
对应于 class '1'。这是一个非常简单的示例,但一般来说,我会处理包含更多项的矩阵。
我想做的基本上是构建一个字典,其中一个键对应于每个 class 并且其对应的值是一个元组列表,其中每个元组对应于输入矩阵的一个位置,其值为钥匙。换句话说,将输入矩阵按其值分组,并获得每个唯一值出现的位置列表。
现在,我有以下代码:
S = {i: [] for i in range(A.max() + 1)}
for i in range(A.shape[0]):
index = np.arange(A[i].shape[0])
sort_idx = np.argsort(A[i])
cnt = np.bincount(A[i])
result = np.split(index[sort_idx], np.cumsum(cnt[:-1]))
for j, k in enumerate(result):
S[j] += [(i, z) for z in k]
其中 A 是我的输入矩阵。
在 500x500 矩阵上平均需要大约 0.4 毫秒到 运行。尽管如此,我觉得它可以通过更好地使用矢量化(也许)来进一步改进。
有人可以指导我如何使它变得更简单 and/or 更快吗?任何帮助表示赞赏。谢谢!
您可以更简单地使用 np.argwhere
和 np.unique
:
S = {}
for key in np.unique(A):
S[key] = np.argwhere(A==key)
请注意,这是一个 returns 二维 numpy 数组。
假设我有一个 2D numpy 数组,其值对应于一个标签或 class。例如,如果
A = [[0, 0, 1, 1], [1, 1, 1, 0]
,则位置 (0, 0), (0, 1), (1, 3)
对应于 class '0',(0, 2), (0, 3), (1, 0), etc
对应于 class '1'。这是一个非常简单的示例,但一般来说,我会处理包含更多项的矩阵。
我想做的基本上是构建一个字典,其中一个键对应于每个 class 并且其对应的值是一个元组列表,其中每个元组对应于输入矩阵的一个位置,其值为钥匙。换句话说,将输入矩阵按其值分组,并获得每个唯一值出现的位置列表。
现在,我有以下代码:
S = {i: [] for i in range(A.max() + 1)}
for i in range(A.shape[0]):
index = np.arange(A[i].shape[0])
sort_idx = np.argsort(A[i])
cnt = np.bincount(A[i])
result = np.split(index[sort_idx], np.cumsum(cnt[:-1]))
for j, k in enumerate(result):
S[j] += [(i, z) for z in k]
其中 A 是我的输入矩阵。 在 500x500 矩阵上平均需要大约 0.4 毫秒到 运行。尽管如此,我觉得它可以通过更好地使用矢量化(也许)来进一步改进。
有人可以指导我如何使它变得更简单 and/or 更快吗?任何帮助表示赞赏。谢谢!
您可以更简单地使用 np.argwhere
和 np.unique
:
S = {}
for key in np.unique(A):
S[key] = np.argwhere(A==key)
请注意,这是一个 returns 二维 numpy 数组。