【问题标题】:"Unsparsing" numpy Arrays with Given Masks具有给定掩码的“Unsparsing”numpy 数组
【发布时间】:2015-09-23 07:11:11
【问题描述】:

假设有两个数组,vals 包含值,masks 包含指示是使用vals 还是nans 中的值的布尔值。目标是构建一个与masks 长度相同的数组ret,其中包含从vals 对应位置的值到True 中的True 条目。

例如,假设

vals = np.array([1, 2])
masks = [True, False, False, True]

那么ret,返回值,应该是

array([1, None, None, 2], dtype=object)

使用循环显然很容易做到这一点:

import numpy as np

def unsparse(vals, masks):
    vals_i = 0
    ret = []
    for m in masks:
        if m:
            ret.append(vals[vals_i])
            vals_i += 1
        else:
            ret.append(None)
    return np.array(ret)

>> unsparse(np.array([1, 2]), [True, False, False, True])
array([1, None, None, 2], dtype=object)

有没有一种方法可以不用循环并且更简洁?

【问题讨论】:

  • 你真的想要那个数组中的None 吗?你会做任何计算吗?

标签: python numpy vectorization sparse-matrix


【解决方案1】:

你可以这样做 -

out = np.empty(masks.shape,dtype=object)
out[masks] = vals[:masks.sum()] 

请注意:masks.sum()vals 中选择第一个N 元素,其中N 是掩码中TRUE 元素的数量。

如果保证 TRUE 元素的数量与 vals 中的元素数量相同,那么你可以简单地做 -

out[masks] = vals 

示例运行 -

In [34]: vals = np.array([1, 2, 6, 8, 9])
    ...: masks = np.array([True, False, False, True, False, True])
    ...: 

In [35]: out = np.empty(masks.shape,dtype=object)
    ...: out[masks] = vals[:masks.sum()]
    ...: 

In [36]: out
Out[36]: array([1, None, None, 2, None, 6], dtype=object)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多