【问题标题】:Remove zero elements with same index from two arrays从两个数组中删除具有相同索引的零元素
【发布时间】:2017-03-22 20:23:05
【问题描述】:

给定两个长度相同的numpy 数组,我需要从它们中删除那些相同的索引元素为零。例如,给定数组

a = [5 9 2 0 1 4 9 0 8 1]
b = [1 0 3 1 2 4 2 0 3 2]

我需要获得

a = [5 9 2 0 1 4 9 8 1]
b = [1 0 3 1 2 4 2 3 2]

即,只有在两个数组中 具有零值的元素被从两个数组中删除。我试过这种方法

import numpy as np

a = np.random.randint(0, 10, 10)
b = np.random.randint(0, 10, 10)

a_z_idx = [a != 0]
b_z_idx = [b != 0]

ab_z_idx = a_z_idx and b_z_idx

a = a[ab_z_idx]
b = b[ab_z_idx]

但这也会删除两个数组中的零元素,而不是只删除两个数组中都为零的元素。

我的实际数组有几百万个元素,所以我追求最有效的方法。

【问题讨论】:

    标签: python arrays performance numpy


    【解决方案1】:

    创建组合掩码和索引 -

    mask = ~((a == 0) & (b==0))
    a,b = a[mask], b[mask]
    

    另一种创建蒙版的方法 -

    mask = (a!=0) | (b!=0)
    

    如果你喜欢内置插件,那些会转化为 -

    ~np.logical_and( a==0, b==0)
    np.logical_or( a!=0, b!=0)
    

    比较掩码创建代码的运行时测试 -

    In [342]: a = np.random.randint(0,10,(100000))
    
    In [343]: b = np.random.randint(0,10,(100000))
    
    In [344]: %timeit ~((a == 0) & (b==0))
         ...: %timeit (a!=0) | (b!=0)
         ...: %timeit ~np.logical_and( a==0, b==0)
         ...: %timeit np.logical_or( a!=0, b!=0)
         ...: 
    10000 loops, best of 3: 67.7 µs per loop
    10000 loops, best of 3: 62.8 µs per loop
    10000 loops, best of 3: 68.4 µs per loop
    10000 loops, best of 3: 62.8 µs per loop
    

    没有看到任何明显的赢家。如果您要挑剔,请选择基于OR-ing 的那些。

    【讨论】:

    • 很好的答案 Divakar!你知道这些方法中是否有任何一种明显比另一种快吗?
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 2018-01-17
    • 2022-12-12
    • 2017-11-05
    • 2018-03-10
    • 2020-12-06
    • 2021-11-24
    • 2013-11-27
    相关资源
    最近更新 更多