我有两个numpy数组,其维数为(120,360),其中一个数组由整数和零组成,第二个数组由浮点数组成。我想在第一个数组中有一个整数的情况下用nans替换第二个数组的值。有没有一个简单而有效的方法来做到这一点?比较两个numpy数组并插入nans
另外,我想用nans替换第一个数组中的整数,并将零变为1。提前致谢。
我有两个numpy数组,其维数为(120,360),其中一个数组由整数和零组成,第二个数组由浮点数组成。我想在第一个数组中有一个整数的情况下用nans替换第二个数组的值。有没有一个简单而有效的方法来做到这一点?比较两个numpy数组并插入nans
另外,我想用nans替换第一个数组中的整数,并将零变为1。提前致谢。
您可以用逻辑的索引到阵列中轻松实现这一点,
arr2[ arr1 != 0 ] = numpy.NaN
然而整数数组不支持NaN的,所以你不得不您的第一个数组转换成int数组,即
arr1 = arr1.astype(float)
arr1[arr1 != 0.0] = numpy.NaN
arr1[arr1 == 0.0] = 1.0
设置阵列:
>>> 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]])
像前评论答案,我不认为比较浮动与==
是一个好主意,我认为有些操作被浪费了。怎么样创建一个临时数组mask = (X != 0)
并将其用作索引?
>>> X = X.astype(float)
>>> X[~mask] = np.nan
>>> X[mask] = 1
我不知道你用的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计算一个数组的平均值肯定是一个坏主意,带有一个掩码数组,这是没有问题的。
谢谢,有没有类似的方式来做到这一点,为第二部分没有创建一个新的数组? – pter 2012-08-06 21:07:33
@pter:在哪里创建了一个新数组?你仍然只有'arr1'和'arr2' – jmetz 2012-08-06 21:08:25
(虽然承认'astype'语句创建了arr1的副本,但我们然后再将它分配给arr1) – jmetz 2012-08-06 21:09:42