在遮罩位置设置值,且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
。