【问题标题】:Zeroing-out array values outside of a centered slice将居中切片之外的数组值清零
【发布时间】:2016-03-07 23:00:13
【问题描述】:

我有一个 2D 数组(抱歉弄乱了):

[[4.8718 7.72844 12.4288 11.7124 7.55014 10.2837 8.50997 3.69767 4.8718]
 [5.91745 13.7384 35.5878 79.1378 94.6858 60.1723 27.6673 12.7537 5.91745]
 [11.1614 29.0228 108.87 175.518 155.52 138.734 96.2145 29.5323 11.1614]
 [14.7855 59.3563 156.22 410.418 669.983 400.613 163.023 58.3647 14.7855]
 [9.87354 87.0854 124.38 775.761 1630.11 744.488 115.188 90.8995 9.87354]
 [8.47966 64.2404 145.325 475.687 931.189 519.85 122.555 69.1578 8.47966]
 [10.0377 27.1189 106.654 112.141 132.298 233.69 136.029 30.2086 10.0377]
 [6.50091 14.2923 24.318 73.8886 128.941 106.06 48.8712 15.8181 6.50091]
 [4.8718 7.72844 12.4288 11.7124 7.55014 10.2837 8.50997 3.69767 4.8718]]

我知道如何获取数组的一个切片,并将该切片的值归零以获得如下所示的内容(我已将 3 x 3 切片归零):

[[4.8718 7.72844 12.4288 11.7124 7.55014 10.2837 8.50997 3.69767 4.8718]
 [5.91745 13.7384 35.5878 79.1378 94.6858 60.1723 27.6673 12.7537 5.91745]
 [11.1614 29.0228 108.87 175.518 155.52 138.734 96.2145 29.5323 11.1614]
 [14.7855 59.3563 156.22 0.0 0.0 0.0 163.023 58.3647 14.7855]
 [9.87354 87.0854 124.38 0.0 0.0 0.0 115.188 90.8995 9.87354]
 [8.47966 64.2404 145.325 0.0 0.0 0.0 122.555 69.1578 8.47966]
 [10.0377 27.1189 106.654 112.141 132.298 233.69 136.029 30.2086 10.0377]
 [6.50091 14.2923 24.318 73.8886 128.941 106.06 48.8712 15.8181 6.50091]
 [4.8718 7.72844 12.4288 11.7124 7.55014 10.2837 8.50997 3.69767 4.8718]]

但是我将如何将数组中的所有值清零,除了原始中心切片中的值(如下所示)?

[[0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0]
 [0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0]
 [0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0]
 [0.0 0.0 0.0 410.418 669.983 400.613 0.0 0.0 0.0]
 [0.0 0.0 0.0 775.761 1630.11 744.488 0.0 0.0 0.0]
 [0.0 0.0 0.0 475.687 931.189 519.85 0.0 0.0 0.0]
 [0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0]
 [0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0]
 [0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0]]

【问题讨论】:

    标签: python arrays numpy data-structures


    【解决方案1】:

    查看 numpy indexing 页面:

    您可以使用布尔掩码(由 x!=0 创建)来索引 x 的副本,将所有适当的值设置为 0。以下应该可以工作:

    In [4]: x = np.random.random((5,5))
    
    
    In [11]: y = x.copy()
    In [14]: y[1:3, 1:3] = 0
    
    array([[ 0.84905824,  0.079079  ,  0.71624639,  0.02272327,  0.00628426],
           [ 0.29032824,  0.        ,  0.        ,  0.98850971,  0.52504821],
           [ 0.45770781,  0.        ,  0.        ,  0.41691402,  0.11052185],
           [ 0.06152469,  0.51321134,  0.6347654 ,  0.82463901,  0.78756266],
           [ 0.96716897,  0.79592572,  0.12402872,  0.25271513,  0.2999993 ]])
    
    In [18]: z = x.copy()
    
    In [19]: z[y!=0] = 0
    
    array([[ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ],
           [ 0.        ,  0.8722439 ,  0.50425235,  0.        ,  0.        ],
           [ 0.        ,  0.05976207,  0.66207464,  0.        ,  0.        ],
           [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ],
           [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ]])
    

    正如@StefanPochmann 所指出的,一旦您拥有带有零的y 矩阵。将 z 计算为:

    z = x - y
    array([[ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ],
           [ 0.        ,  0.8722439 ,  0.50425235,  0.        ,  0.        ],
           [ 0.        ,  0.05976207,  0.66207464,  0.        ,  0.        ],
           [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ],
           [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ]])
    

    不需要花哨的索引。

    【讨论】:

      猜你喜欢
      • 2015-08-28
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多