代码之家  ›  专栏  ›  技术社区  ›  chitown88

使用numpy数组对另一个数组执行条件操作

  •  0
  • chitown88  · 技术社区  · 2 年前

    假设我有两个数组:

    a = np.array([2, 2, 0, 0, 2, 1, 0, 0, 0, 0, 3, 0, 1, 0, 0, 2])
    
    b = np.array([0, 0.5, 0.25, 0.9])
    

    我想做的是,获取数组中的值 b 并将其乘以数组中的值 a ,基于它的索引。

    所以数组中的第一个值 A. 是2。我想要数组中的值 B 在该索引位置乘以该值。所以在阵列中 B ,索引位置2的值为 0.25 ,所以在数组中乘以该值(2) A. 通过 0.25 .

    我知道这可以通过迭代来完成,但我正试图弄清楚它是如何完成elmentwise操作的。

    以下是我所做的迭代方式:

    result = np.array([])
    for idx in a:
        result = np.append(result, (b[idx] * idx))
    

    要获得结果:

    print(result)
    [0.5 0.5 0.  0.  0.5 0.5 0.  0.  0.  0.  2.7 0.  0.5 0.  0.  0.5]
    

    元素等价物是什么?

    1 回复  |  直到 2 年前
        1
  •  1
  •   rveronese    2 年前

    整数数组可以用作numpy中的索引。因此,你可以简单地做这样的事情

    b[a] * a
    

    编辑:

    为了完整起见,您的迭代解决方案每次都会触发新的内存分配 append 调用(请参阅 this page ).因为你现在已经知道了你的输出的形状(即。 a.shape ),最好提前分配输出数组,例如。 result = np.empty(a.shape) 然后经历这个循环。

        2
  •  0
  •   x0lani    2 年前

    有几种方法可以做到这一点,但是如果你想要纯元素操作,你可以做以下几点:

    在得到结果之前,b的每个元素都会通过其索引进行转换。所以再创建一个向量 N .

    n = np.arange(len(b)) * b
    
    # In the example, n now equals [0. , 0.5, 0.5, 2.7]
    
    # then the result is just n indexed by a
    
    result = n[a]
    
    # result = [0.5, 0.5, 0. , 0. , 0.5, 0.5, 0. , 0. , 0. , 0. , 2.7, 0. , 0.5, 0. , 0. , 0.5]