我有两个数组:
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
的第二列,我只想放弃b
中b
中不存在的那些元素a
。预期结果是:
result =
[[ -2. 0. ]
[ 14. 15. ]
[ -7. 28. ]]
首先,我想到了这个'子阵列'只包含我感兴趣的行的b
。在许多其他事情中,我认为可行的(并且没有)是:
result = b[b[:, 1] in a[:, 1]] # not working
欢迎任何帮助。
答案 0 :(得分:5)
此算法在以下假设下工作:
a
的第二列是b
第二列的子集。这意味着我们保证在b
的第二列中找到一个值,并在a
的第二列中给出一个值。a
和b
的第二列已排序。a
和b
之间共享的第二列中没有重复值。使用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