2012-08-06 55 views
3

我有两个numpy数组,其维数为(120,360),其中一个数组由整数和零组成,第二个数组由浮点数组成。我想在第一个数组中有一个整数的情况下用nans替换第二个数组的值。有没有一个简单而有效的方法来做到这一点?比较两个numpy数组并插入nans

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

回答

5

您可以用逻辑的索引到阵列中轻松实现这一点,

arr2[ arr1 != 0 ] = numpy.NaN 

然而整数数组不支持NaN的,所以你不得不您的第一个数组转换成int数组,即

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

谢谢,有没有类似的方式来做到这一点,为第二部分没有创建一个新的数组? – pter 2012-08-06 21:07:33

+0

@pter:在哪里创建了一个新数组?你仍然只有'arr1'和'arr2' – jmetz 2012-08-06 21:08:25

+0

(虽然承认'astype'语句创建了arr1的副本,但我们然后再将它分配给arr1) – jmetz 2012-08-06 21:09:42

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) 

可以容易地设置所述第二阵列以NA n其中你想,像这样:

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

然后转换头阵列漂浮(因为陈楠不是整数),并设置所需的值:

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

像前评论答案,我不认为比较浮动与==是一个好主意,我认为有些操作被浪费了。怎么样创建一个临时数组mask = (X != 0)并将其用作索引?

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

我不知道你用的NaN替换值的目的,但你可能要考虑使用numpy的的蒙面数组来代替(类似于皮埃尔的答案,但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计算一个数组的平均值肯定是一个坏主意,带有一个掩码数组,这是没有问题的。