簡體   English   中英

逐元素布爾乘法

[英]Element-wise boolean multiplication

我正在尋找最美麗和簡短的方法來增加這些類型的列表:

a = [True, False, True, False, False]

b = [100, 200]

B的長度等於 真元素的數目

我需要的答案是[100, 0, 200, 0, 0]

有沒有簡單的方法來得到答案?
它看起來像元素乘法,但事實是第二個列表的大小較小,因此常見的numpy方法在沒有錯誤代碼的情況下不起作用。

希望,你會找到很好的解決方案

你可以在numpy做到這一點:

c = np.array(a).astype(int)

c[c==1] = b

>>> c
array([100,   0, 200,   0,   0])

注意如果您需要將結果作為列表(基於所需的輸出)而不是numpy數組,請使用c.tolist()

有一個非常干凈的基於迭代器的解決方案

it = iter(b)
[next(it) if x else 0 for x in a]
# [100, 0, 200, 0, 0]

另一種選擇是使用numpy.place()numpy.put()

c = np.zeros_like(a, dtype=np.result_type(b))
np.place(c, a, b)

要么

c = np.zeros_like(a, dtype=np.result_type(b))
np.put(c, np.flatnonzero(a), b)

我更喜歡第一種選擇。

時序:

生成更大的數據集:

In [39]: a = np.random.randint(0, 2, 100000).astype(np.bool_)

In [40]: b = np.random.randint(0, 100000, np.sum(a))

@sacul解決方案:

In [41]: %timeit c = np.array(a).astype(int); c[c==1] = b
621 µs ± 13.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

我的第一個選擇:

In [42]: %timeit c = np.zeros_like(a, dtype=np.result_type(b)); np.place(c, a, b)
462 µs ± 8.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

從上面的@AGN滑動一下

c = np.zeros_like(a, dtype = b.dtype)
c[a] = b

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM