忽略索引数组中的NaN值,从NumPy数组中获取索引。

3

我有一个零数组

arr = np.zeros([5,5])
array([[ 0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.]])

我想根据索引分配值,所以我做了这个。

out = np.array([[nan,2.,4.,1.,1.],[nan,3.,4.,4.,4.]])

arr[out[0].astype(int),np.arange(len(out[0]))] = 1
arr[out[1].astype(int),np.arange(len(out[1]))] = 1

如果是0而不是NaN,那么分配工作就很好。

如果遇到NaN,我该怎么跳过分配?是否有可能一次从多维索引数组中分配值,而不是使用for循环逐个赋值?

1个回答

2

Mask it -

mask = ~np.isnan(out)
arr[out[0,mask[0]].astype(int),np.flatnonzero(mask[0])] = 1
arr[out[1,mask[1]].astype(int),np.flatnonzero(mask[1])] = 1

示例运行 -


In [171]: out
Out[171]: 
array([[ nan,   2.,   4.,   1.,   1.],
       [ nan,   3.,   4.,   4.,   4.]])

In [172]: mask = ~np.isnan(out)
     ...: arr[out[0,mask[0]].astype(int),np.flatnonzero(mask[0])] = 1
     ...: arr[out[1,mask[1]].astype(int),np.flatnonzero(mask[1])] = 1
     ...: 

In [173]: arr
Out[173]: 
array([[ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  1.],
       [ 0.,  1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  1.,  1.]])

作为替代,可以使用范围掩码代替flatnonzero调用-

r = np.arange(arr.shape[1])
arr[out[0,mask[0]].astype(int),r[mask[0]]] = 1
arr[out[1,mask[1]].astype(int),r[mask[1]]] = 1

如果你处理的行数不止 2 行,而且想要以向量化的方式对它们进行分配,这里有一种方法,使用 线性索引 -

n = arr.shape[1]
linear_idx = (out*n + np.arange(n))
np.put(arr, linear_idx[~np.isnan(linear_idx)].astype(int), 1)

先生,我的第二个问题。 - Bharath M Shetty
@Bharathshetty 第二个问题在哪里? - Divakar
能否在一行中写出相同的代码,而不使用arr[out[0...]和arr[out[1...]]? - Bharath M Shetty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接