Python &引用;“不放火”;具有给定掩码的numpy阵列

Python &引用;“不放火”;具有给定掩码的numpy阵列,python,numpy,vectorization,sparse-matrix,Python,Numpy,Vectorization,Sparse Matrix,假设有两个数组,vals包含值,masks包含布尔值,指示是使用vals中的值还是使用nans中的值。目标是构建一个与掩码长度相同的数组ret,其中包含vals中相应位置的值,这些值对应于掩码中的True条目 例如,假设 vals = np.array([1, 2]) masks = [True, False, False, True] 然后返回值ret,应该是 array([1, None, None, 2], dtype=object) 使用循环显然很容易做到这一点: import n

假设有两个数组,
vals
包含值,
masks
包含布尔值,指示是使用
vals
中的值还是使用
nan
s中的值。目标是构建一个与
掩码
长度相同的数组
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
元素的数量

如果保证真实元素的数量与
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)

您真的希望该数组中的
None
?你打算做什么计算吗?