微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过一维列表中的值屏蔽二维 numpy 矩阵的行?

如何解决如何通过一维列表中的值屏蔽二维 numpy 矩阵的行?

我有一个看起来像这样的 2D numpy 数组:

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 实现。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。