Numpy将两个MaskedArrays与OR运算相结合

时间:2019-01-07 08:46:19

标签: python arrays python-3.x numpy combinations

我有两个MaskedArray对象,它们的长度相同:

>> grades_passed
   [90 -- 88 62 -- 100]
>> grades_not_passed
  [-- 54 -- -- 34 --]

我正在尝试将它们结合起来以得到:

[90 54 88 62 34 100]

我尝试了一些操作,例如:

total_final = grades_passed + grades_not_passed

total_final = ma.mask_or(grades_passed, grades_not_passed)
total_final = ma.concatenate(grades_passed, grades_not_passed)

但没有一个能解决问题

2 个答案:

答案 0 :(得分:2)

只要两个遮罩没有重叠,以下操作即可:

grades = grades_passed.filled(1) * grades_not_passed.filled(1)

参数1临时设置了两个变量的fill_value,因此掩码值采用1作为要填充的值。

答案 1 :(得分:0)

将数组转换为列表,并创建带有索引值的字典(这假设两个数组在相同的索引位置将没有值)。然后,您可以将它们组合起来并以掩码数组或列表的形式输出结果:

def combine_grades(passed, failed):
    # Put index:value for each list into a dictionary
    pass_dict = {list(passed).index(i):i for i in list(passed) if i != '--'}
    fail_dict = {list(failed).index(i):i for i in list(failed) if i != '--'}

    # Combine those dictionaries
    full_dict = {**pass_dict, **fail_dict}

    # Return a masked array (if that's what you want. Otherwise, just return the list)
    return ma.array([full_dict[i] for  i in sorted(full_dict)])

然后致电:

combine_grades(grades_passed, grades_not_passed)

输出:

masked_array(data=[ 90,  54,  88,  62,  34, 100],
             mask=False,
       fill_value=999999)