测试Numpy数组是否包含给定的行

测试Numpy数组是否包含给定的行,第1张

测试Numpy数组是否包含给定的行

__contains__
在编写本文时,
(a ==b).any()

Numpys可以说是正确的,除非它
b
是一个标量(它有点毛,但我相信–仅在1.7或更高版本中如此工作–这将是正确的常规方法
(a ==b).all(np.arange(a.ndim - b.ndim, a.ndim)).any()
,这使得的所有组合
a
b
维度的意义)…

编辑:只是要清楚,这是 不是
一定预期的结果,当广播参与。还有人可能会争辩说,它应该

a
np.in1d
这样分开处理这些项目。我不确定是否应该有一种明确的方法。

现在,您希望numpy在找到第一个匹配项时停止。该AFAIK目前不存在。这很困难,因为numpy主要基于ufunc,它们在整个数组上执行相同的 *** 作。Numpy确实优化了这种减少,但是只有在要减少的数组已经是布尔数组(即

np.ones(10,dtype=bool).any()
)时才有效。

否则,它将需要一个

__contains__
不存在的特殊功能。这似乎很奇怪,但是您必须记住numpy支持许多数据类型,并且具有更大的机制来选择正确的数据类型并选择正确的函数来对其进行处理。因此,换句话说,ufunc机制无法做到这一点,并且
__contains__
由于数据类型的原因,实现这样的 *** 作实际上并不是那么简单。

您当然可以用python编写它,或者因为您可能知道数据类型,所以用Cython / C编写它非常简单。


那就是。无论如何,对这些事情使用基于排序的方法通常要好得多。这有点乏味,并且没有

searchsorted
for那样的东西
lexsort
,但是它可以工作(
scipy.spatial.cKDTree
如果您愿意,也可以滥用)。假设您只想沿最后一个轴进行比较:

# Unfortunatly you need to use structured arrays:sorted = np.ascontiguousarray(a).view([('', a.dtype)] * a.shape[-1]).ravel()# Actually at this point, you can also use np.in1d, if you already have many b# then that is even better.sorted.sort()b_comp = np.ascontiguousarray(b).view(sorted.dtype)ind = sorted.searchsorted(b_comp)result = sorted[ind] == b_comp

这也适用于数组

b
,并且如果保留排序后的数组,则一次保持单个值(行)
b
,并且
a
保持不变(如果我将
np.in1d
其视为一个数组,那么一次)也将更好。重新排列)。
重要提示:
np.ascontiguousarray
为了安全起见,您必须这样做。它通常什么也不做,但是如果这样做,否则将是一个很大的潜在错误。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5662713.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存