我有两个数组,看起来像这样:
X = np.array([ 157, 262, 368, 472, 577, 682, 786, 891, 996, 1100, 1204,
1310, 1415, 1520, 1625, 1731, 1879])
Y = np.array([ 30, 135, 240, 345, 450, 555, 660, 765, 870, 975, 1080,
1185, 1290, 1395, 1500, 1605])
阵列将:
我想根据以下内容将这两个元素交叉放入一个新数组Z
:
Xi
只能包含在Z
中,前提是Yj
在Y
中没有其他元素的值差小于abs(Xi - Yj)
,并且{我知道我可以用一堆嵌套的for循环来实现这一点,但我想知道是否有更聪明、更整洁的方法来实现这一点?在
(我意识到,从我提出问题的方式来看,这听起来像是从教科书上剪下来的。不是的。但也许这是一个经典的排序函数,谁知道呢,但对我这个生物学家来说。。。我只能说,我不知道如何高效、简洁地解决问题。)
编辑:不是很好的例子
^{pr2}$我甚至不完全确定它是否满足所有的标准,但是当重写旧代码时,我只做了一个循环。。。一定还有更好的办法!在
让我们试着为这个例子找出解决方案:
我们可以计算
^{pr2}$X
中的值与Y
中的值之间的所有距离,如下所示:行对应于
X
值,列对应于Y
值。在为了找到最接近}之间的最小值。在
Y
中某个元素的X
值,我们将查找 对于X
,它对应于dist
的列中的最小值 矩阵。每列对应一个特定的Y
,因此 列对应于某个X
和某个{从视觉上讲,我们要寻找的是
dist
中的值,它们是 两者的最小值它们所在的行,和它们所在的列 在。我们称之为“行列最小值”。在在上面的
dist
数组中,40是行列的最小值。65是最小值, 但不是行列最小值。在对于每一列,我们可以找到X索引,该索引通过以下方式将列最小化:
同样,对于每一行,我们可以这样找到Y索引:
现在,让我们暂时忘掉这个例子,假设
idx1
如下所示:这意味着在第5列中,第2行的值最小。在
然后,如果第2行、第5列对应于行列最小值,则
idx2
必须看起来像这样:我们可以用NumPy来表达这种关系
所以对应于行列最小值的X,Y值是
以及
Timeit结果:
因此
alt_find_close
明显比find_close
快。在我想你可能想使用
scipy.spatial.cKDTree
(你可以自己用numpy来构建这样的东西searchsorted
,但我看不出有多大意义,除非可以对等距离的问题有更多的控制)。在但是一般来说你应该小心。您的例子是整数数组,根据发现的情况,可能会有问题(argmin总是找到第一个,所以可能并不重要,但是对于这个例子,如果您有相等的距离,您可能会放弃点)。在
如果数组变大(每个数组可能有几百个左右),这将大大加快。例如:
^{pr2}$但是我在这里使用浮点数是有原因的,如果你能有相等的距离,结果就不能保证。分类是不同的,没有真正找出原因。在
编辑:实际上,您还可以将两个数组排序为一个数组(并记住哪个数组属于哪个类),然后检查两个不同类的相邻位置。如果一个点有另一个类的两个邻接点,用手挑近一个。这可能更快,而且只使用numpy。在
相关问题 更多 >
编程相关推荐