找到相似值的索引

时间:2013-09-20 11:25:47

标签: python numpy

我有一个看起来像这样的numpy数组

a   b

1   1
1   1
1   1
1   2
1   3
1   3
2   24
3   1
3   1
3   1
3   1
4   5
4   5
4   7
4   9

是否有可能得到b的值相等的所有值的索引? (我不想索引a = b,我想要所有'a'的索引,其中'b'相等)

例如对于a = 1和b = 1,它应该只返回我[0,1,2], 对于a = 1和b = 2,返回[3] 对于a = 1和b = 3,返回[4,5] 对于a = 2和b = 24,它应该归还给我[6] 等等。

5 个答案:

答案 0 :(得分:3)

将它们加载到pandas DataFrame中并执行groupby:

>>> df = pd.DataFrame({'a': a, 'b': b})
>>> df.groupby(['a', 'b']).groups
{(1, 1): [0, 1, 2],
 (1, 2): [3],
 (1, 3): [4, 5],
 (2, 24): [6],
 (3, 1): [7, 8, 9, 10],
 (4, 5): [11, 12],
 (4, 7): [13],
 (4, 9): [14]}

然后只需选择您想要的值:

>>> df.groupby(['a', 'b']).groups[(1, 1)]
[0, 1, 2]
>>> df.groupby(['a', 'b']).groups[(2, 24)]
[6]

或者,如果您愿意,可以使用以下方法获取多索引DataFrame:

>>> res = df.groupby(['a', 'b']).apply(lambda group: group.index.values)
>>> res[1, 1]
array([0, 1, 2])
>>> res[2, 24]
array([6])

答案 1 :(得分:1)

要获取a[i] != b[i]尝试此操作的所有索引:

return [ i for i in range(len(a)) if a[i] != b[i] ]

如果你想创建一个找到所有索引的函数,其中a和b的给定值是,请使用:

def findIndexes(aValue, bValue):
   return [ i for i in range(len(a)) if a[i] == aValue and b[i] == bValue ]

现在findIndexes(2, 24)将返回[ 6 ]findIndexes(1, 1)将返回[ 0, 1, 2 ]

答案 2 :(得分:1)

使用列表理解:

la = [1, 1, 1, 1, 1, 1, 2 , 3, 3, 3, 3, 4, 4, 4, 4]
lb = [1, 1, 1, 2, 3, 3, 24, 1, 1, 1, 1, 5, 5, 7, 9]

def find_similar(a, b):
   assert len(la) == len(lb)
   return [s for s in xrange(len(la)) if la[s] == a and lb[s] == b]

print find_similar(1, 1)
print find_similar(2, 24)

打印:

[0, 1, 2]
[6]

答案 3 :(得分:1)

对于大型NumPy数组,最快捷的方法是使用np.where

import numpy as np  

a = np.array([1,1,1,1,1,1,2,3,3,3,3,4,4,4,4])
b = np.array([1,1,1,2,3,3,24,1,1,1,1,5,5,7,9])

print(np.where((a==1) & (b==1))[0])
# [0 1 2]    
print(np.where((a==1) & (b==2))[0])
# [3]
print(np.where((a==1) & (b==3))[0])
# [4 5]

答案 4 :(得分:1)

使用纯粹的numpy并且可能比熊猫回答快得多。

arr
array([[ 1,  1],
       [ 1,  1],
       [ 1,  1],
       [ 1,  2],
       [ 1,  3],
       [ 1,  3],
       [ 2, 24],
       [ 3,  1],
       [ 3,  1],
       [ 3,  1],
       [ 3,  1],
       [ 4,  5],
       [ 4,  5],
       [ 4,  7],
       [ 4,  9]])

tmp =  np.ascontiguousarray(arr).view(np.dtype((np.void, arr.dtype.itemsize * arr.shape[1])))

uvals,uinds = np.unique(tmp, return_inverse=True)

uinds
array([0, 0, 0, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5, 6, 7])

uvals.view(arr.dtype).reshape(uvals.shape + (-1,))
array([[ 1,  1],
       [ 1,  2],
       [ 1,  3],
       [ 2, 24],
       [ 3,  1],
       [ 4,  5],
       [ 4,  7],
       [ 4,  9]])