具有给定掩码的“无火花”numpy数组

2024-10-02 02:38:06 发布

您现在位置:Python中文网/ 问答频道 /正文

假设有两个数组,vals包含值,masks包含布尔值,指示是使用vals,还是nans中的值。目标是构建一个长度与masks相同的数组ret,其中包含来自{}的值,这些值位于True中{}中的相应位置。在

例如,假设

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

那么返回值ret应该是

^{pr2}$

使用循环显然非常容易:

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)

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


Tags: nonefalsetrue目标np数组arraymasks
1条回答
网友
1楼 · 发布于 2024-10-02 02:38:06

你可以这样做-

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

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

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

^{pr2}$

样本运行-

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)

相关问题 更多 >

    热门问题