numpy - 在两个数组中选择列相等的行

时间:2015-08-06 19:25:32

标签: python arrays numpy

我有两个数组:

position:absolute;

a = 
[[ 461.  0.  ]
 [ 480.  15. ]
 [ 463.  28. ]]

仅当b = [[ 463. 0. ] [ 462. 8. ] [ 466. 15. ] [ 469. 22. ] [ 470. 28. ] [ 473. 34. ]] 的第二列位于a的第二列时,我才需要由b减去a => [0 15 28]组成的结果数组。 b => [0 8 15 22 28 34]第二列的所有元素都位于a的第二列,我只想放弃bb中不存在的那些元素a 。预期结果是:

result =
[[  -2.  0.  ]
 [  14.  15. ]
 [  -7.  28. ]]

首先,我想到了这个'子阵列'只包含我感兴趣的行的b。在许多其他事情中,我认为可行的(并且没有)是:

result = b[b[:, 1] in a[:, 1]] # not working

欢迎任何帮助。

2 个答案:

答案 0 :(得分:5)

此算法在以下假设下工作:

  1. a的第二列是b第二列的子集。这意味着我们保证在b的第二列中找到一个值,并在a的第二列中给出一个值。
  2. ab的第二列已排序。
  3. ab之间共享的第二列中没有重复值。
  4. 使用numpy.in1d确定是否可以在b中找到a第二列中的相应值。然后,您可以使用此布尔数组切入b并使用a的第一列和b的切片结果的第一列进行减法。这有效的原因是因为b中排序顺序的性质。当与numpy.in1d一起切入此数组时,您可以保证此切片结果的第二列与第一列a的值完全匹配。完成此对齐后,您可以使用a的第一列减去此切片结果的第一列。为了完成这些工作,您可以复制b切片值的第二列,并将它们叠加在一起:

    In [119]: import numpy as np
    
    In [120]: a = np.array([[461,0],[480,15],[463,28]], dtype=np.float)
    
    In [121]: b = np.array([[463,0], [462,8], [466,15], [469,22], [470,28], [473,34]], dtype=np.float)
    
    In [122]: ind = np.in1d(b[:,1], a[:,1])
    
    In [123]: np.column_stack([a[:,0]-b[ind,0], b[ind,1]])
    Out[123]: 
    array([[ -2.,   0.],
           [ 14.,  15.],
           [ -7.,  28.]])
    

    numpy.in1d返回的是一个布尔数组,它告诉您numpy.in1d的第一个输入中的第i个值是否可以在{的第二个输入中找到 {1}}。要查看这些内容,根据您的数据,我们得到:

    numpy.in1d

    如您所见,In [124]: ind Out[124]: array([ True, False, True, False, True, False], dtype=bool) 中的第一个,第三个和第五个值都可以在b中找到。我们只需切片到a并提取右行,切片结果的这些行将使第二列值与b中的第二列值完全对齐。然后我们一起减去a和中间结果的第一列。

    更干净的方法是切入a并提取整个矩阵而不是仅提取第一列,然后只用b和第一列中间结果减去第一列:

    a

答案 1 :(得分:1)

鉴于您的评论中的条件,以下内容应该有效:

def calculate_diffs(b, a):
    brow = b[:, 1]
    arow = a[:, 1]
    # Find common indices.  For your example, indices == [0, 2, 4]
    indices = numpy.searchsorted(brow, arow)
    r = a.copy()
    r[:, 0] = b[indices, 0] - a[:, 0]
    return r