3

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

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

4

4 回答 4

5

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

arr2[ arr1 != 0 ] = numpy.NaN

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

arr1 = arr1.astype(float)
arr1[arr1 != 0.0] = numpy.NaN
arr1[arr1 == 0.0] = 1.0
于 2012-08-06T21:01:47.597 回答
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]])
于 2012-08-06T21:05:39.190 回答
0

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

>>> X = X.astype(float)
>>> X[~mask] = np.nan
>>> X[mask] = 1
于 2012-08-07T13:25:17.340 回答
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 计算数组的平均值肯定是个坏主意,但使用掩码数组,这没问题。

于 2012-08-07T13:44:40.910 回答