【问题标题】:Make specific elements of numpy matrix as 0将numpy矩阵的特定元素设为0
【发布时间】:2017-03-24 00:05:16
【问题描述】:

我使用以下方法获得了 Numpy Matrix (M) 的 0 个元素的索引:

index_array = numpy.argwhere(M == 0)

现在,我想在其他矩阵 B 中将这些索引元素(index_array 中的索引)设为 0。有什么 numpy 方法可以做到这一点吗?

例如:index_array 包含

[[2 1]
[4 4]]

,所以将矩阵 B 中 (2,1) 和 (4,4) 处的元素设为 0。

【问题讨论】:

    标签: python-3.x numpy


    【解决方案1】:

    你应该使用np.where,它返回一个行和列索引的元组,因此可以直接用作索引,而不是argwhere,只要索引没有超出B的范围,你可以做到:

    B[np.where(M == 0)] = 0
    

    示例

    M = np.array([[1,2],[3,0],[0,1]])
    
    M
    #array([[1, 2],
    #       [3, 0],
    #       [0, 1]])
    
    B = np.array([[1,2,3],[4,5,6],[7,8,9]])    
    B
    #array([[1, 2, 3],
    #       [4, 5, 6],
    #       [7, 8, 9]])
    
    B[np.where(M == 0)] = 0
    
    B
    #array([[1, 2, 3],
    #       [4, 0, 6],
    #       [0, 8, 9]])
    

    如果要坚持np.argwhere,可以分别获取行索引和列索引,然后赋值:

    index_array = np.argwhere(M == 0)
    B[index_array[:,0], index_array[:,1]] = 0
    

    【讨论】:

    • 或者更好的是,使用B[M == 0] = 0
    • 更一般地,您可以使用B[tuple(index_array.T)] 来索引np.argwhere 的结果
    • @Eric 不错的选择。不知道元组可以在这样的数组上工作。
    • a[b,c] 只是a[(b, c)] 的语法糖。在这两种情况下,它们都会调用type(a).__getitem__(a, (b, c))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多