【问题标题】:Identify and replace rows in a ndarray识别和替换 ndarray 中的行
【发布时间】:2014-03-23 05:01:13
【问题描述】:

这类似于this 问题,只是我有一个更严格的条件:我需要替换整行的出现,而不仅仅是可能存在于列中其他位置的值。第 368 行应该可以说明到目前为止有多少花式索引的实验失败了:

In [368]:

a=np.array([[[ 42.30803907,   0.        ,   0.        ],
        [ 42.30803907,   3.0052592 ,   0.        ]],

       [[ 42.30803907,   3.0052592 ,   0.        ],
        [ 40.54907736,   5.44198582,   0.        ]],

       [[ 40.54907736,   5.44198582,   0.        ],
        [ 42.14713681,   8.84169967,   0.        ]]])
In [369]:

toBeReplaced=np.array([ 42.30803907,   3.0052592 ,   0.        ])
In [370]:

b=a==toBeReplaced
#b returns:
#array([[[ True, False,  True],
#        [ True,  True,  True]],
#
#       [[ True,  True,  True],
#        [False, False,  True]],
#
#       [[False, False,  True],
#        [False, False,  True]]], dtype=bool)

这就是我似乎无法正确理解条件语法的地方:

a=np.where(b==[True,True,True], [9,9,9], a)

Out[373]:
array([[[  9.        ,   0.        ,   9.        ],
        [  9.        ,   9.        ,   9.        ]],

       [[  9.        ,   9.        ,   9.        ],
        [ 40.54907736,   5.44198582,   9.        ]],

       [[ 40.54907736,   5.44198582,   9.        ],
        [ 42.14713681,   8.84169967,   9.        ]]])

您可以看到,布尔掩码以列为基础替换了所有匹配项。有没有办法改变布尔掩码或它用作选择器的数组,以便只有所有三列中的值与搜索数组的列匹配的行?

(请注意,虽然我的数据是 float64,但我正在寻找的所有“匹配”事件在 np.all() 上都返回 True,因为它们是相同的基础计算值。)

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    您可以创建一个掩码来标识所有列中满足条件的位置:

    mask = np.all(a==[42.30803907, 3.0052592, 0.], axis=2)
    a[mask] = [9, 9, 9]
    
    #array([[[ 42.30803907,   0.        ,   0.        ],
    #        [  9.        ,   9.        ,   9.        ]],
    # 
    #       [[  9.        ,   9.        ,   9.        ],
    #        [ 40.54907736,   5.44198582,   0.        ]],
    # 
    #       [[ 40.54907736,   5.44198582,   0.        ],
    #        [ 42.14713681,   8.84169967,   0.        ]]])
    

    【讨论】:

    • 宾果游戏,明白了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多