我有两个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最坏情况复杂性。
答案 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
值会转换为1
而False
会转换为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)
这将生成a
和b
元素的新列表,配对成员。
例如:
>>> 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