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

时间:2010-01-27 15:28:08

标签: python numpy

我正在寻找找到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

3 个答案:

答案 0 :(得分:6)

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

查看numpy.where文档以获取解释。基本上,numpy.where(a, b, c),对于条件a,返回一个形状a的数组,以及来自bc的值,具体取决于是否相应的元素a是否属实。 bc可以是标量。

顺便说一下,对于两个正数,x & y不一定“总是正确”。对于xy中的元素,它bitwise-and

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中的对应元素为{{1 1s。通常,对于两个非零数字nab可能等于零,或非零,但不一定等于a & b或{{1} }。

答案 1 :(得分: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.

答案 2 :(得分:0)

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

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

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

参数

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

返回

面具:bool的ndarray,形状(M,)     值ar1[mask]位于ar2

另见

numpy.lib.arraysetops:具有许多其他功能的模块                         在数组上执行set操作。

备注

in1d可以被视为元素的函数版本 python关键字in,用于1D序列。 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])