【问题标题】:Numpy combine two MaskedArrays with OR operationNumpy 将两个 MaskedArrays 与 OR 操作结合起来
【发布时间】:2019-01-07 08:46:18
【问题描述】:

我有两个长度相同的 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)

但没有一个能做到这一点

【问题讨论】:

  • 在您的示例中,掩码是彼此的not。总是这样吗?
  • a.filled(0) + b.filled(0) 可能会起作用。

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


【解决方案1】:

以下工作,只要两个掩码没有重叠:

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

参数1临时设置两个变量的fill_value,所以掩码值取1作为填充值。

【讨论】:

  • 或者干脆np.array(grades_passed.filled(1) * grades_not_passed.filled(1))
  • 谢谢@yatu。我修改了答案以符合您的建议。
【解决方案2】:

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

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-21
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2011-06-19
    • 1970-01-01
    • 2015-01-04
    相关资源
    最近更新 更多