【问题标题】:Create a boolean array comparing each matrix in a Numpy tensor to a different integer in a Numpy Array创建一个布尔数组,将 Numpy 张量中的每个矩阵与 Numpy 数组中的不同整数进行比较
【发布时间】:2020-09-17 21:37:16
【问题描述】:

假设我有一个 3*3*3 的 Numpy 张量 X(实际尺寸会有所不同)。我想针对一组整数中的不同值测试张量中的每个矩阵。

例如如果

X=np.array([1,2,3]*9).reshape(3,3,3)
test=np.array([1,2,3])

期望的输出是:

 [[[ True, False, False],
    [True, False, False],
    [True, False, False]],

   [[False,  True, False],
    [False,  True, False],
    [False,  True, False]],

   [[False, False,  True],
    [False, False,  True],
    [False, False,  True]]])

但是我似乎无法得到这个结果。 X==测试返回:

array([[[ True,  True,  True],
        [ True,  True,  True],
        [ True,  True,  True]],

       [[ True,  True,  True],
        [ True,  True,  True],
        [ True,  True,  True]],

       [[ True,  True,  True],
        [ True,  True,  True],
        [ True,  True,  True]]])

如果

test=[[1],[2],[3]] 

我明白了:

array([[[ True, False, False],
        [False,  True, False],
        [False, False,  True]],

       [[ True, False, False],
        [False,  True, False],
        [False, False,  True]],

       [[ True, False, False],
        [False,  True, False],
        [False, False,  True]]])

同样的结果也适用于 np.equal。有没有不使用任何循环的直接方法来做到这一点?考虑到索引,似乎有一种方法

X[[0,1,2],[0,2,1]] 

会产生

np.array([X[0][0],X[1][2],X[2][1]])

而不是

X[:,[0,2,1]]

【问题讨论】:

    标签: arrays numpy boolean vectorization tensor


    【解决方案1】:

    这是一个简单的相等比较,但棘手的部分是弄清楚如何广播操作。你可以这样做,

    X == test[:, None, None]
    
    array([[[ True, False, False],
            [ True, False, False],
            [ True, False, False]],
    
           [[False,  True, False],
            [False,  True, False],
            [False,  True, False]],
    
           [[False, False,  True],
            [False, False,  True],
            [False, False,  True]]])
    

    在哪里,

    test[:, None, None]
    
    array([[[1]],
    
           [[2]],
    
           [[3]]])
    

    这个想法是让Xtest的维度匹配,这样我们就可以广播相等比较,所以test的第一项与X的第一个子矩阵比较,第二项与第二个子矩阵相比较,以此类推。

    【讨论】:

    • 非常感谢!!这几天我一直盯着这个。所以 None 本质上等同于 np.newaxis 并且每个括号对应一个轴对吗?如果将来遇到此类问题,有什么建议可以求助于其他来源吗?因为如果你没有发布,我将永远在屏幕上开始。
    • @phntm 我是通过在这里提问来学习的,和你一样:) 最终也开始回答,因为这样你学得更快。有些人在网上推荐各种教程和视频,但对我来说,文档是事实的来源。好的文档通常会提供一些指导您了解基础知识的教程,numpy 也不例外。关于索引的具体主题,请尝试阅读indexing docs
    猜你喜欢
    • 2014-11-20
    • 2019-05-23
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多