2

我有一个看起来像这样的 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

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

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

4

5 回答 5

3

将它们加载到 pandas DataFrame 并进行分组:

>>> 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])
于 2013-09-20T11:38:03.213 回答
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 ]

于 2013-09-20T11:35:04.487 回答
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]
于 2013-09-20T11:38:39.270 回答
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]
于 2013-09-20T11:42:36.010 回答
1

使用纯粹的 numpy 并且可能比 pandas 答案快得多。

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]])
于 2013-09-20T12:12:51.533 回答