我有一个看起来像这样的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] 等等。
答案 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]])