在遮罩位置设置值,且numpy中存在NAN

在遮罩位置设置值,且numpy中存在NAN,numpy,nan,Numpy,Nan,比如说,我和南斯有一个数组 >>> a = np.random.randn(3, 3) >>> a[1, 1] = a[2, 2] = np.nan >>> a array([[-1.68425874, 0.65435007, 0.55068277], [ 0.71726307, nan, -0.09614409], [-1.45679335, -0.12772348, nan]

比如说,我和南斯有一个数组

>>> a = np.random.randn(3, 3)
>>> a[1, 1] = a[2, 2] = np.nan
>>> a
array([[-1.68425874,  0.65435007,  0.55068277],
       [ 0.71726307,         nan, -0.09614409],
       [-1.45679335, -0.12772348,         nan]])
我想将此数组中的负数设置为
-1
。以“直截了当”的方式执行此操作会导致一个警告,我正试图避免:

>>> a[a < 0] = -1
__main__:1: RuntimeWarning: invalid value encountered in less
>>> a
array([[-1.        ,  0.65435007,  0.55068277],
       [ 0.71726307,         nan, -1.        ],
       [-1.        , -1.        ,         nan]])
解决这个问题的唯一办法是使用免费的中间屏蔽版
a

>>> n = ~np.isnan(a)
>>> b = a[n]
>>> b[b < 0] = -1
>>> a[n] = b
>>> a
array([[-1.        ,  0.65435007,  0.55068277],
       [ 0.71726307,         nan, -1.        ],
       [-1.        , -1.        ,         nan]])

根据。

如果您想避免在
a<0
a
包含
Nan
的情况下出现警告,我认为替代方法包括使用
展平的
非Nan
位置的行列
索引,然后执行比较。因此,我们对这一理念有两种方法

指数平坦的-

idx = np.flatnonzero(~np.isnan(a))
a.ravel()[idx[a.ravel()[idx] < 0]] = -1
idx=np.flatnonzero(~np.isnan(a))
a、 拉威尔()[idx[a.拉威尔()[idx]<0]=-1
另一个是带有下标索引的-

idx = np.flatnonzero(~np.isnan(a))
a.ravel()[idx[a.ravel()[idx] < 0]] = -1
r,c=np.nonzero(~np.isnan(a))
掩码=a[r,c]<0
a[r[mask],c[mask]]=-1

如果您想避免在
a<0
a
包含
Nan
的情况下出现警告,我认为替代方法包括使用
展平的
行-列
索引的
非Nan
位置,然后执行比较。因此,我们对这一理念有两种方法

指数平坦的-

idx = np.flatnonzero(~np.isnan(a))
a.ravel()[idx[a.ravel()[idx] < 0]] = -1
idx=np.flatnonzero(~np.isnan(a))
a、 拉威尔()[idx[a.拉威尔()[idx]<0]=-1
另一个是带有下标索引的-

idx = np.flatnonzero(~np.isnan(a))
a.ravel()[idx[a.ravel()[idx] < 0]] = -1
r,c=np.nonzero(~np.isnan(a))
掩码=a[r,c]<0
a[r[mask],c[mask]]=-1

您可以暂时取消该警告,这是您想要的吗

In [9]: a = np.random.randn(3, 3)

In [10]: a[1, 1] = a[2, 2] = np.nan

In [11]: with np.errstate(invalid='ignore'):
   ....:     a[a < 0] = -1
   ....:
[9]中的
:a=np.random.randn(3,3)
在[10]中:a[1,1]=a[2,2]=np.nan
在[11]中:带有np.errstate(invalid='ignore'):
..:a[a<0]=-1
....:

您可以暂时取消该警告,这是您想要的吗

In [9]: a = np.random.randn(3, 3)

In [10]: a[1, 1] = a[2, 2] = np.nan

In [11]: with np.errstate(invalid='ignore'):
   ....:     a[a < 0] = -1
   ....:
[9]中的
:a=np.random.randn(3,3)
在[10]中:a[1,1]=a[2,2]=np.nan
在[11]中:带有np.errstate(invalid='ignore'):
..:a[a<0]=-1
....:

np.nan…
我找到的函数
np.nan\u to\u num

In [569]: a=np.arange(9.).reshape(3,3)-5
In [570]: a[[1,2],[1,2]]=np.nan
In [571]: a
Out[571]: 
array([[ -5.,  -4.,  -3.],
       [ -2.,  nan,   0.],
       [  1.,   2.,  nan]])
In [572]: np.nan_to_num(a)   # replace nan with 0
Out[572]: 
array([[-5., -4., -3.],
       [-2.,  0.,  0.],
       [ 1.,  2.,  0.]])
In [573]: np.nan_to_num(a)<0    # and safely do the <
Out[573]: 
array([[ True,  True,  True],
       [ True, False, False],
       [False, False, False]], dtype=bool)
In [574]: a[np.nan_to_num(a)<0]=-1
In [575]: a
Out[575]: 
array([[ -1.,  -1.,  -1.],
       [ -1.,  nan,   0.],
       [  1.,   2.,  nan]])
因此,它就像你的版本,带有“免费”的面具,但它隐藏在函数中


np.place
np.putmask
是使用掩码的其他函数。

np.nan…
中搜索我找到的
np.nan\u to\u num

In [569]: a=np.arange(9.).reshape(3,3)-5
In [570]: a[[1,2],[1,2]]=np.nan
In [571]: a
Out[571]: 
array([[ -5.,  -4.,  -3.],
       [ -2.,  nan,   0.],
       [  1.,   2.,  nan]])
In [572]: np.nan_to_num(a)   # replace nan with 0
Out[572]: 
array([[-5., -4., -3.],
       [-2.,  0.,  0.],
       [ 1.,  2.,  0.]])
In [573]: np.nan_to_num(a)<0    # and safely do the <
Out[573]: 
array([[ True,  True,  True],
       [ True, False, False],
       [False, False, False]], dtype=bool)
In [574]: a[np.nan_to_num(a)<0]=-1
In [575]: a
Out[575]: 
array([[ -1.,  -1.,  -1.],
       [ -1.,  nan,   0.],
       [  1.,   2.,  nan]])
因此,它就像你的版本,带有“免费”的面具,但它隐藏在函数中


np.place
np.putmask
是使用掩码的其他函数。
a[~np.isnan(a)&(a@Divakar.这是我尝试的第一件事。我刚刚将
~np.isnan(a)
绑定到
n
。警告仍然存在,因为
a,第二件事,从技术上讲。那么
a[~np.isnan(a)&(a@Divakar.这是我尝试的第一件事。我只是将
~np.isnan(a)
绑定到
n
。警告仍然存在,因为
aWell,第二件事,从技术上讲。这根本不是我想要的,而是一个完全有效的解决方案。为什么这根本不是[你想要的]寻找“?这不是比其他解决方案更简单,计算效率更高吗?根本不是我想要的,而是一个完全有效的解决方案。为什么这根本不是[你]寻找“?这不是比其他解决方案更简单,计算效率更高吗?整洁的解决方案。我在寻找一种方法来避免尽可能多的临时数组,但看起来这不是一个选项。整洁的解决方案。我在寻找一种方法来避免尽可能多的临时数组,但看起来这不是一个选项。巧妙地使用中间索引。我正在做一些类似于中间选择数组的事情,但它没有那么优雅。由于我的数据类型是
float64
,因此需要更多的空间。巧妙地使用了中间索引。我正在做一些类似于中间选择数组的事情,但它没有那么优雅。从我的数据类型是
float64