numpy:ravel_multi_index通过迭代索引循环增加不同的结果

时间:2015-02-11 09:09:23

标签: python numpy scipy

我有一系列索引(可能重复),我将另一个2D矩阵中的每个索引递增1.有几个建议,answer建议使用np.ravel_multi_index。< / p>

所以,我已经试过了,但他们似乎没有给我同样的答案。知道为什么吗?

raveled = np.ravel_multi_index(legit_indices.T, acc.shape)
counts = np.bincount(raveled)
acc = np.resize(counts, acc.shape)

acc2 = np.zeros(acc2.shape)
for i in legit_indices:
    acc2[i[0], i[1]] += 1

(Pdb) np.array_equal(acc, acc2)
False

(Pdb) acc[493][5]
135
(Pdb) acc2[493][5]
0.0

1 个答案:

答案 0 :(得分:1)

您当前的方法存在一些问题。首先,np.bincount(x) 将为您提供从<0>开始的 {/ 1}} 的每个正整数值的计数 并以x结束:

max(x)

因此,如果不是print(np.bincount([1, 1, 3, 3, 3, 4])) # [0, 2, 0, 3, 1] # i.e. [count for 0, count for 1, count for 2, count for 3, count for 4] 中的每个位置都被索引,则长度为 acc.flat将大于唯一索引的数量。什么 您实际想要的是np.bincount(raveled)acc.flat中那些位置的 索引至少一次。

其次,您要做的是将bin计数分配给相应的 索引到acc.flat。您对np.resize的呼吁是重复部分 您的bincounts数组,以使其与acc.flat的大小相同, 然后将其重塑为与acc相同的形状。这不会导致垃圾箱 将计数分配到acc中的正确位置!

我解决这个问题的方法是使用np.unique代替 np.bincount,并使用它返回唯一索引及其对应的索引 计数。然后,这些可用于将正确的计数分配到acc

中的正确唯一位置
import numpy as np

# some example data
acc = np.zeros((4, 3))
legit_indices = np.array([[0, 1],
                          [0, 1],
                          [1, 2],
                          [1, 0],
                          [1, 0],
                          [1, 0]])

# convert the index array into a set of indices into acc.flat
flat_idx = np.ravel_multi_index(legit_indices.T, acc.shape)

# get the set of unique indices and their corresponding counts
uidx, ucounts = np.unique(flat_idx, return_counts=True)

# assign the count value to each unique index in acc.flat
acc.flat[uidx] = ucounts

# confirm that this matches the result of your for loop
acc2 = np.zeros_like(acc)
for ii, jj in legit_indices:
    acc2[ii, jj] += 1

assert np.array_equal(acc, acc2)