【问题标题】:Performing operations on a NumPy arrray but masking values along the diagonal from these operations对 NumPy 数组执行操作,但从这些操作中沿对角线屏蔽值
【发布时间】:2010-12-20 16:54:54
【问题描述】:

因为我可以对数组执行操作,所以在对角线上什么都不做 计算使得除了对角线之外的所有部分

array ([[0.,  1.37, 1.,   1.37, 1.,   1.37, 1.]
       [1.37, 0. ,  1.37, 1.73, 2.37, 1.73, 1.37]
       [1. ,  1.37, 0. ,  1.37, 2. ,  2.37, 2. ]
       [1.37, 1.73, 1.37, 0. ,  1.37, 1.73, 2.37]
       [1. ,  2.37, 2. ,  1.37, 0. ,  1.37, 2. ]
       [1.37, 1.73, 2.37, 1.73, 1.37, 0. ,  1.37]
       [1. ,  1.37, 2. ,  2.37, 2. ,  1.37, 0. ]])

为了避免 NaN 值,但在所有响应中保留对角线上的零值

【问题讨论】:

  • 你想做什么?涉及的操作是什么?您是否要进行矩阵乘法或求逆?你的问题很不清楚。

标签: python arrays numpy scipy


【解决方案1】:

我想知道掩码数组是否可以做你想做的事情,例如,

import numpy as NP
A = NP.random.random_integers(0, 9, 16).reshape(4, 4)
dg = NP.r_[ [NP.nan] * 4 ]  # proper syntax is 'nan' not 'NaN'
dg = NP.diag(dg)
A += dg                     # a 4x4 array w/ NaNs down the main diagonal
NP.sum(A, axis=1)           # doesn't work, gives: array([ NaN,  NaN,  NaN,  NaN])  
from numpy import ma as MA
Am = **MA.masked_invalid**(A)
NP.sum(Am, axis=1)         # now it works (treats 'nan' as 0)

当然,另一种方法是先将 NaN 转换为 0,然后 屏蔽 0:

NP.nan_to_num(A)
MA.masked_equal(A, 0)

最后,一步屏蔽和转换 NaN 通常很有效:

MA.fix_invalid(A)

非常简单,只要记住'ma' 可能还没有在你的命名空间中,而且这些函数处理'NaNs' 'infs',这通常是你想要的。

【讨论】:

    【解决方案2】:

    照常进行计算,然后

    myarray[arange(len(array)), arange(len(array))] = 0.
    

    【讨论】:

      【解决方案3】:
      >>> arr = [
      ... [0.,  1.37, 1.,   1.37, 1.,   1.37, 1.],
      ... [1.37, 0. ,  1.37, 1.73, 2.37, 1.73, 1.37],
      ... [1. ,  1.37, 0. ,  1.37, 2. ,  2.37, 2. ],
      ... [1.37, 1.73, 1.37, 0. ,  1.37, 1.73, 2.37],
      ... [1. ,  2.37, 2. ,  1.37, 0. ,  1.37, 2. ],
      ... [1.37, 1.73, 2.37, 1.73, 1.37, 0. ,  1.37],
      ... [1. ,  1.37, 2. ,  2.37, 2. ,  1.37, 0. ]
      ... ]
      >>> for i in range(6):
      ...     for y in range(6):
      ...             if (i <> y):
      ...                     print arr[i][y]*arr[y][i]
      ...
      1.8769
      1.0
      1.8769
      1.0
      1.8769
      1.8769
      1.8769
      2.9929
      5.6169
      2.9929
      1.0
      1.8769
      1.8769
      4.0
      5.6169
      1.8769
      2.9929
      1.8769
      1.8769
      2.9929
      1.0
      5.6169
      4.0
      1.8769
      1.8769
      1.8769
      2.9929
      5.6169
      2.9929
      1.8769
      

      取决于你需要计算什么

      【讨论】:

        【解决方案4】:

        你可以像平常一样进行计算,然后将对角线设置为零吗?

        【讨论】:

        • 然后在每次计算后执行:for i in range(len(array)):array[i][i]=0
        猜你喜欢
        • 2016-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-14
        • 2016-06-30
        • 2014-03-11
        相关资源
        最近更新 更多