问题描述
a = np.array([[0,1,2,3,4],[0,4]])
b = [4,4]
我想根据给定行中的哪些值小于我的一维列表 (b) 中的相应值来屏蔽我的二维数组 (a)。例如,行 a[0] 将根据该行中的哪些值小于 b[0] 处的值进行屏蔽;与行 a[1] 和 b[1] 处的值相同,依此类推...
我希望得到的是布尔值的二维数组:
mask_bools = [[True,True,False],[True,False,False]]
mask_bools = []
for i in range(len(b)):
mask_bools.append(np.ma.masked_less(a[i],b[i]).mask)
mask_bools = np.array(mask_bools)
但我觉得必须有更好/更快的方法来做到这一点,以更好地利用 numpy 功能。有任何想法吗?谢谢!
解决方法
你可以试试这个:
import numpy as np
a = np.array([[0,1,2,3,4],[0,4]])
b = np.array([[4,]*len(a)).T
a < b
array([[ True,True,False],[ True,False,False]])
为了提高使用效率:
b = np.tile(np.array([[4,4]]).transpose(),(1,len(a)))
然而这更难阅读。
,尝试小于 broadcasting
:
<div id = 'completeCard'>
<div id = 'mainCard' class = 'card border-dark'>
<a id = '#input-title' href = '#' onclick = 'activate();'>
<img class = 'card-img-top' src = '#input-link' alt = '#input-title'>
<div class = 'card-body bg-secondary'>
<h3 class = 'text-center'>#input-title</h3>
</div>
</a>
</div>
<div id = 'card-desc' class = 'pt-2'>
<div id = '#input-title'>
<div class = 'card border-dark'>
<div class = 'card-body bg-secondary'>
<h6 class = 'text-center text-dark'>#input-desc</h6>
</div>
</div>
</div>
</div>
</div>
a < b[:,None]
[[ True True True True False]
[ True True True False False]
[ True True False False False]
[ True True True False False]
[ True True True True False]]
,
您可以使用 np.vectorize 来实现这一点。创建一个函数来比较适当索引处的值并返回一个布尔值。
它基本上和你现在所做的一样,但正如你所说,这只是 NumPy 实现。