比较两个numpy数组和插入nans

时间:2012-08-06 20:58:10

标签: python numpy

我有两个具有维度(120,360)的numpy数组,其中一个数组由整数和零组成,第二个由浮点数组成。我想在第一个数组中有一个整数的地方用nans替换第二个数组的值。有一种简单有效的方法吗?

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

4 个答案:

答案 0 :(得分:5)

通过逻辑索引到数组中,您可以轻松实现这一目标,

arr2[ arr1 != 0 ] = numpy.NaN

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

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

答案 1 :(得分: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)

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

>>> 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]])

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我不知道你用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计算数组的平均值当然是个坏主意,使用掩码数组,这没有问题。