寻找在numpy中两个长度相等的数组之间精确重叠的最快方法

4
我正在寻找在numpy中查找两个数组之间的完全重叠的最佳(最快)方法。给定两个数组x和y。
x = array([1,0,3,0,5,0,7,4],dtype=int)
y = array([1,4,0,0,5,0,6,4],dtype=int)

我希望得到的是一个相同长度的数组,其中仅包含两个向量中相等的数字:
array([1,0,0,0,5,0,0,4])

我先尝试了

x&y
array([1,0,0,0,5,0,6,4])

然后我意识到,如果两个数字都大于0,这个结论总是成立的。


听起来你需要一个序列比对软件包,你是在做生物信息学吗? - Dana the Sane
你的最后一句话应该是“当两个数字不等于0时,它们总是成立”。 - Boris Gorelik
3个回答

6
result = numpy.where(x == y, x, 0)

请查看numpy.where文档以获得解释。基本上,对于条件anumpy.where(a, b, c)返回一个形状为a的数组,并具有来自bc的值,这取决于相应元素的a是true还是false。bc可以是标量。
顺便说一句,x & y对于两个正数不一定“总是true”。它对xy中的元素进行按位与
x = numpy.array([2**p for p in xrange(10)])
# x is [  1   2   4   8  16  32  64 128 256 512]
y = x - 1
# y is [  0   1   3   7  15  31  63 127 255 511]
x & y
# result: [0 0 0 0 0 0 0 0 0 0]

这是因为x中每个元素的按位表示形式都是1后跟n个零,而y中相应的元素是n个1。一般来说,对于两个非零数aba & b可能等于零,也可能非零但不一定等于ab

2

使用numpy.where是最通用的解决方案。但在这种特定情况下,因为这是一种有用的编程实践,您可以使用x==y作为掩码:

mask = x==y  
# mask is  array([ True, False, False,  True,  True,  True, False,  True], dtype=bool)

xf = mask * x
# xf is array([1, 0, 0, 0, 5, 0, 0, 4])

或直接
xf = (x==y) * x

现在想象一些数据 X(例如声音的1D,图像的2D,电影的3D等)

(X<1) * -1. + (X>1) * 1.

当幅度小于1时,数据的值为-1,否则为1.


0

尝试使用numpy.in1d...从文档中....

测试一个一维数组的每个元素是否也存在于第二个数组中。

返回一个与ar1长度相同的布尔数组,其中ar1的元素在ar2中为True,否则为False。

参数

ar1:array_like,形状(M,) 输入数组。 ar2:array_like 用于测试ar1每个值的值。 assume_unique:bool,可选 如果为True,则假定输入数组都是唯一的,这可以加快计算速度。默认值为False。

返回值

mask:ndarray of bools,形状(M,) ar1[mask]中的值在ar2中。

另请参阅

numpy.lib.arraysetops:模块中有许多其他用于执行数组集合操作的函数。

注意事项

in1d 可以被视为 1D 序列中 python 关键字 in 的逐元素函数版本。 in1d(a, b) 大致相当于 np.array([item in b for item in a])

.. versionadded:: 1.4.0

示例

test = np.array([0, 1, 2, 5, 0])
states = [0, 2]
mask = np.in1d(test, states)
mask
    array([ True, False,  True, False,  True], dtype=bool)
test[mask]
    array([0, 2, 0])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接