代码之家  ›  专栏  ›  技术社区  ›  Edy Bourne

如何仅在三维Numpy数组的某些列中用另一个值替换一个值?

  •  0
  • Edy Bourne  · 技术社区  · 2 年前

    我有一个3d numpy数组和一个列列表(轴=1),我想用一个常数值替换所有的零:

    我的样本数据如下:

    data = np.array([
        [[10, 10, 10], [0, 10, 10], [0, 10, 0]],
        [[20, 0, 20], [20, 20, 0], [0, 20, 20]],
        [[0, 30, 30], [30, 0, 30], [0, 30, 30]],
    ])
    

    我的尝试是:

    columns_to_replace = [0, 1]
    data[data[:, columns_to_replace, :] == 0.0] = 1000  # value to replace
    

    但这会导致:

    IndexError: boolean index did not match indexed array along dimension 1; dimension is 3 but corresponding boolean dimension is 2
    

    我希望输出为:

    [[[10 10 10]
      [ 1000 10 10]
      [ 0 10  0]]
    
     [[20  1000 20]
      [20 20  1000]
      [ 0 20 20]]
    
     [[ 1000 30 30]
      [30  1000 30]
      [ 0 30 30]]]
    

    其中,第二维度的索引0和1将所有零替换为1000。

    我想我可能必须组成这个内部布尔数组,以便形状与 data 数组中未包含的列 columns_to_replace 数组都设置为 True ,但不确定如何实现。

    我是走在正确的轨道上,还是有其他更好的方法?

    1 回复  |  直到 2 年前
        1
  •  1
  •   Alijoonami    2 年前

    请尝试以下操作:

    import numpy as np
    
    data = np.array([
        [[10, 10, 10], [0, 10, 10], [0, 10, 0]],
        [[20, 0, 20], [20, 20, 0], [0, 20, 20]],
        [[0, 30, 30], [30, 0, 30], [0, 30, 30]],
    ])
    
    columns_to_replace = [0, 1]
    value_to_replace = 1000
    
    # Create a boolean mask for the zeros
    mask = data[:, columns_to_replace, :] == 0
    
    # Use the mask to replace the zeros with the desired value
    data[:, columns_to_replace, :][mask] = value_to_replace
    
    print(data)
    

    我得到的结果是:

    [[[  10   10   10]
    [1000   10   10]
    [   0   10    0]]
    
    [[  20 1000   20]
    [  20   20 1000]
    [   0   20   20]]
    
    [[1000   30   30]
    [  30 1000   30]
    [   0   30   30]]]