通过比较python中的两个numpy数组来建立索引

时间:2015-05-22 12:55:58

标签: python numpy

我有两个numpy数组,我想通过索引比较来制作索引,

例如

a=[1,'aaa', 'bbb', 'vvv', 'www']
b=[2,'qqq', 'bbb', 'ppp', 'www']

通常,itersection会将数组的每个值与不同数组的每个值进行比较,

是否有任何有效的方法是python比较两个np数组索引 从上面的例子中,当我们执行a和b之间的交集时,我们看到数组b的值2与a中的所有值进行比较,类似的值' qqq'将数组b的数据与数组a中的所有值进行比较,在最坏的情况下可以给出n * n复杂度,n是数组的长度。

上述例子的输出结果为2(对于' bbb'和' www')

我想要的是交叉点可以是索引方式,让我们说当数组b与a进行比较时。数组b中的value2应仅与数组a的值1进行比较,并且对象' qqq' b应该与对象“aaa”进行比较。等等..

这也将解决上述交叉结果的n * n最坏情况复杂性。

3 个答案:

答案 0 :(得分:1)

如果我了解了您可以从列表中创建数组并直接比较后的内容,则可以通过调用sum来获取计数:

In [161]:

a=[1,'aaa', 'bbb', 'vvv', 'www']
b=[2,'qqq', 'bbb', 'ppp', 'www']
A = np.array(a)
B = np.array(b)
sum(A==B)
Out[161]:
2

当使用执行相等比较时,这将产生一个布尔数组:

In [166]:

A==B
Out[166]:
array([False, False,  True, False,  True], dtype=bool)

当您致电sum时,True值会转换为1False会转换为0,以便您对True求和1}}值

修改

在np.array上调用.sum()会更高效:

In [173]:

a=[1,'aaa', 'bbb', 'vvv', 'www']
a *=100
b=[2,'qqq', 'bbb', 'ppp', 'www']
b *=100
A = np.array(a)
B = np.array(b)
%timeit (A==B).sum()
%timeit sum(A==B)
The slowest run took 2784.03 times longer than the fastest. This could mean that an intermediate result is being cached 
100000 loops, best of 3: 11.4 µs per loop
1000 loops, best of 3: 1.34 ms per loop

顶级sum明显慢于预期。

答案 1 :(得分:0)

使用zip Python内置函数:

zip(a, b)

这将生成ab元素的新列表,配对成员。

例如:

>>> zip([1, 2, 3], [4, 5, 6])
[(1, 4), (2, 5), (3, 6)]

然后你可以对新数组的元素进行比较:

for elem in zip(a, b):
    your_comparison(elem[0], elem[1])
    ...

答案 2 :(得分:0)

如果我理解你想要的东西,这里是 a 方式:

[使用ipython]

In [1]: import numpy as np

In [2]: a = np.array([1, 'aaa', 'bbb', 'vvv', 'www'])

In [3]: b = np.array([2, 'qqq', 'bbb', 'ppp', 'www'])

In [4]: (a == b).sum()
Out[4]: 2