【问题标题】:How to replace specific indices of a matrix using numpy in python如何在python中使用numpy替换矩阵的特定索引
【发布时间】:2021-04-03 08:48:46
【问题描述】:

python 初级水平。我有一个要处理的大矩阵 (MxN) 和一个包含一些索引的 Mx1 矩阵。我想要的是用 NaN 替换 MxN 矩阵的每一行,因为该行的列小于 Mx1 索引矩阵列出的列。

比如说我有:

A = [1  2  3  4]
    [5  6  7  8]
    [9 10 11 12]

B = [0]
    [2]
    [1]

结果矩阵应该是

C = [1    2   3  4]
    [NaN NaN  7  8]
    [NaN 10  11 12]

我试图避免使用 for 循环,因为我正在处理的矩阵很大,而且这个函数将是重复的。有没有一种优雅的 Pythonic 方式来实现这一点?

【问题讨论】:

    标签: python numpy matrix


    【解决方案1】:

    查看此代码:
    这里的逻辑是,第一种方法的工作原理是为np.where 创建condition-matrix,并按照以下方式完成

    import numpy as np
    
    A = np.array([[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]], dtype=np.float)
    B = np.array([[0], [2], [1]])
    
    B = np.array(list(map(lambda i: [False]*i[0]+[True]*(4-i[0]), B)))
    A = np.where(B, A, np.nan)
    print(A)
    

    方法二:使用基本的pythonic代码

    import numpy as np
    
    A = np.array([[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]], dtype=np.float)
    B = np.array([[0], [2], [1]])
    
    for i,j in enumerate(A):
        j[:B[i][0]] = np.nan        
    
    print(A)
    

    【讨论】:

    • np.arange(4)>=B 是创建布尔掩码的更快方法。
    • @hpaulj 谢谢你,我真的很喜欢它,它将为broadcasting in numpy 提供洞察力
    【解决方案2】:

    您的数组 - 请注意 A 是浮动的,因此它可以容纳 np.nan

    In [348]: A = np.arange(1,13).reshape(3,4).astype(float); B = np.array([[0],[2],[1]])
    In [349]: A
    Out[349]: 
    array([[ 1.,  2.,  3.,  4.],
           [ 5.,  6.,  7.,  8.],
           [ 9., 10., 11., 12.]])
    In [350]: B
    Out[350]: 
    array([[0],
           [2],
           [1]])
    

    一个布尔掩码是我们想要改变的值:

    In [351]: np.arange(4)<B
    Out[351]: 
    array([[False, False, False, False],
           [ True,  True, False, False],
           [ True, False, False, False]])
    

    应用它:

    In [352]: A[np.arange(4)<B] = np.nan
    In [353]: A
    Out[353]: 
    array([[ 1.,  2.,  3.,  4.],
           [nan, nan,  7.,  8.],
           [nan, 10., 11., 12.]])
    

    【讨论】:

      猜你喜欢
      • 2014-11-29
      • 2019-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      • 2017-05-09
      • 2018-01-02
      相关资源
      最近更新 更多