python - "Unsparsing"具有给定掩码的 numpy 数组

标签 python numpy vectorization sparse-matrix

假设有两个数组,vals 包含值,masks 包含 bool 值,指示是使用 vals 中的值,还是使用 >nans。目标是构建一个与 masks 长度相同的数组 ret,其中包含 vals 中与 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)

有没有一种方法可以在没有循环的情况下更简洁地做到这一点?

最佳答案

你可以做这样的事情 -

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)

关于python - "Unsparsing"具有给定掩码的 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32733203/

相关文章:

Python:如何设置 python-ldap 以忽略引用?

python - Homebrew 和 pyenv 在 MacOSX Yosemite 上的共存

matlab - 从每行中添加不同数量的元素

python - 访问 python for 循环值

python - 如何使用 numpy 配对 (x,y) 对

Python-如何将数组添加到唯一的 numpy 数组?每个数组必须代表我的 numpy 数组中的一行

python - 具有频率和计数的 matplotlib 直方图

python - 对具有屏蔽索引的 numpy 数组进行矢量化求和运算

Python Numpy 计算不循环

python - 使用递归从嵌套列表中获取绝对值