【问题标题】:Compare two numpy arrays and insert nans比较两个numpy数组并插入nans
【发布时间】:2012-08-07 21:44:40
【问题描述】:

我有两个尺寸为 (120, 360) 的 numpy 数组,其中一个数组由整数和零组成,第二个数组由浮点数组成。我想在第一个数组中有整数的地方用 nans 替换第二个数组的值。有没有一种简单有效的方法来做到这一点?

我还想用 nans 替换第一个数组中的整数并将零更改为一。提前致谢。

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    您可以通过对数组的逻辑索引轻松实现这一点,

    arr2[ arr1 != 0 ] = numpy.NaN
    

    但是整数数组不支持 NaN,因此您必须将第一个数组转换为浮点数组,即

    arr1 = arr1.astype(float)
    arr1[arr1 != 0.0] = numpy.NaN
    arr1[arr1 == 0.0] = 1.0
    

    【讨论】:

    • 谢谢,有没有类似的方法可以在不创建新数组的情况下为第二部分执行此操作?
    • @pter: 新数组在哪里创建?你仍然只有arr1arr2
    • (尽管astype 语句确实创建了 arr1 的副本,但我们随后将其再次分配给 arr1)
    • 对,我在你编辑之前输入了它。再次感谢,效果很好。
    【解决方案2】:

    设置数组:

    >>> import numpy as np
    >>> x = np.array([[1,0],[0,4]], dtype=int)
    >>> y = np.array([[1.1, 2.2],[3.3, 4.4]], dtype=float)
    

    您可以轻松地将第二个数组设置为所需的 nan,如下所示:

    >>> y[x != 0] = np.nan
    >>> y
    array([[ nan,  2.2],
           [ 3.3,  nan]])
    

    然后将第一个数组转换为浮点数(因为 NaN 不是整数)并设置你想要的值:

    >>> x = x.astype(float)
    >>> x[x != 0] = np.nan
    >>> x[x == 0] = 1
    >>> x
    array([[ nan,   1.],
           [  1.,  nan]])
    

    【讨论】:

      【解决方案3】:

      作为对先前答案的评论,我认为将浮点数与== 进行比较不是一个好主意,而且我认为有些操作是浪费的。如何创建一个临时数组mask = (X != 0) 并将其用作索引?

      >>> X = X.astype(float)
      >>> X[~mask] = np.nan
      >>> X[mask] = 1
      

      【讨论】:

        【解决方案4】:

        我不知道您用 NaN 替换值的目的,但您可能想考虑使用 numpy 的掩码数组(类似于 Pierre 的回答,但 numpy 具有内置掩码支持!):

        import numpy.ma
        # mask out values when there is a non-zero integer in arr1
        arr2 = numpy.ma.masked_array(arr2, mask=arr1)
        # mask out values in arr2 for non-zero integers, and set all remaining values (the zeros) to 1
        arr1 = numpy.ma(arr1, mask=(arr1 != 0))
        arr1[~arr1.mask] = 1
        

        不需要整数到浮点数的转换,这使您可以使用许多 numpy 的功能而不会遇到问题。例如,用 NaN 计算数组的平均值肯定是个坏主意,但使用掩码数组,这没问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-08-21
          • 2015-01-28
          • 1970-01-01
          • 2019-02-06
          • 2017-01-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多