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

例如,假设

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()N中选择第一个vals元素,其中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 - 给定掩码的“无稀疏” numpy数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32733203/

10-13 02:44