2016-05-16 63 views
2

在Python中我会怎么做:检查,看是否数组元素相等

说我有:

a = [[1, 5], [2,6], [3,3], [4,2]] 
b= [[3, 1], [4,2], [1,8], [2,4]] 

现在我想做的操作与第二列的值如果第一列值匹配。

E.G.

一个具有入口[,5],现在去到b看看哦它有一个值,8],现在我要分5/8和存储值转换成说数组C。接下来将匹配[,6]和[,4]并获得c:6/4中的下一个值。

这样:

c = [5/8, 6/4, 3/1, 2/2] 

鉴于上述示例。我希望这是有道理的。想用numpy和python来做到这一点。

+2

“a”的第一列是否总是排序? 'a'中的每个第一列数字是否出现在'b'中?它们的尺寸是否相同? – kennytm

+0

@kennytm对所有人都是。 – Scientized

+0

每个列表中的第一个位置是否允许重复? –

回答

4

可以使用np.searchsorted得到其中b的第一列元素对应于a的第一列的元件,并使用该获得除法相应的第二列元素和最后得到c的位置。因此,假设ab是NumPy的阵列,所述向量化的实施方法是 -

a0 = a[:,0] 
c = np.true_divide(a[:,1],b[np.searchsorted(a0,b[:,0],sorter=a0.argsort()),1]) 

上面列出适用于一个通用的情况下,当a第一列的元件不一定排序的方法。但是,如果他们进行排序,就像所列出的样品的情况下,你可以简单地忽略sorter输入参数,并具有简化的解决方案,像这样 -

c = np.true_divide(a[:,1],b[np.searchsorted(a0,b[:,0]),1]) 

采样运行 -

In [35]: a 
Out[35]: 
array([[1, 5], 
     [2, 6], 
     [3, 3], 
     [4, 2]]) 

In [36]: b 
Out[36]: 
array([[3, 1], 
     [4, 2], 
     [1, 8], 
     [2, 4]]) 

In [37]: a0 = a[:,0] 

In [38]: np.true_divide(a[:,1],b[np.searchsorted(a0,b[:,0],sorter=a0.argsort()),1]) 
Out[38]: array([ 0.625, 1.5 , 3. , 1. ]) 
1

你可以使用简单的O(n^2)嵌套循环方式:

c = [] 

for x in a: 
for y in b: 
    if x[0] == y[0]: 
    c.append(x[1]/y[1]) 
    break 

上面的内容在列表很小时很有用。对于巨大的列表,考虑一种基于字典的方法,其中复杂性将以O(n)为代价,但需要额外的空间。

4

考虑到所有在评论部分的假设,这将工作:

from operator import itemgetter 
from __future__ import division 

a = [[1, 5], [2,6], [3,3], [4,2]] 
b = [[3, 1], [4,2], [1,8], [2,4]] 

result = [x/y for (_, x), (_, y) in zip(a, sorted(b, key=itemgetter(0)))] 

假设:列出具有相等的长度,在第一位置元素是每个列表独特的,第一个列表是由第一个元素进行排序,在a的第一个位置出现的每个元素也出现在b的第一个位置。

+1

这是否假设a中的每个第一列条目在b中具有对应条目? – trans1st0r

+0

可能需要一个'from __future__ import division' – Eric

+0

@ trans1st0r:是的,因为这是_“在评论部分中的假设”_ – Eric

0

我虚心地建议你使用错误的数据结构。请注意,如果您的数组列具有介于1和N之间的唯一值(索引列),则只需重新排序其他列即可对相同的数据进行编码。重新排列数据后,您不仅可以删除“索引”列,而且现在可以更轻松地对剩余数据进行操作。让我证明:

import numpy as np 

N = 5 
a = np.array([[1, 5], [2,6], [3,3], [4,2]]) 
b = np.array([[3, 1], [4,2], [1,8], [2,4]]) 

a_trans = np.ones(N) 
a_trans[a[:, 0]] = a[:, 1] 

b_trans = np.ones(N) 
b_trans[b[:, 0]] = b[:, 1] 

c = a_trans/b_trans 
print c 

根据您的问题的性质,有时可以使用隐式指数从一开始,但是偶尔也有明确的指标是非常有用的。如果您需要明确的索引,请考虑使用类似pandas.DataFrame的索引操作更好的支持。