【问题标题】:Looking for the fastest way to find the exact overlap between two arrays of equal length in numpy寻找在numpy中找到两个等长数组之间确切重叠的最快方法
【发布时间】:2010-01-27 15:28:08
【问题描述】:

我正在寻找最佳(最快)方法来找到 numpy.xml 中两个数组之间的确切重叠。给定两个数组 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 的数字总是正确的。

【问题讨论】:

  • 听起来你需要一个序列比对包,你是在做生物信息学吗?
  • 您的最后一句话应该是“如果两个数字是 !=0,则它们始终为真”

标签: python numpy


【解决方案1】:
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 中对应的元素是n 1s。一般来说,对于两个非零数字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.

    【讨论】:

      【解决方案3】:

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

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

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

      参数

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

      返回

      掩码:布尔数组,形状(M,) ar1[mask] 的值在 ar2 中。

      另见

      numpy.lib.arraysetops :具有许多其他功能的模块 对数组执行集合操作。

      注意事项

      in1d 可以被认为是 python 关键字in,用于一维序列。 in1d(a, b) 大致是 相当于np.array([item in b for item in a])

      .. 添加的版本:: 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])
      

      【讨论】:

        猜你喜欢
        • 2021-03-30
        • 2015-12-13
        • 1970-01-01
        • 2018-07-06
        • 2020-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多