python 避免通过numpy的负索引输出

bq9c1y66  于 2022-12-17  发布在  Python
关注(0)|答案(1)|浏览(139)

给定一个numpy数组A,如下所示:

[[    0.   482.  1900.   961.   579.    56.]
 [    0.   530.  1906.   914.   584.    44.]
 [   43.     0.  1932.   948.   556.    51.]
 [    0.   482.  1917.   946.   581.    52.]
 [    0.   520.  1935.   878.   589.    55.]]

我得到了需要过滤的元素,如下所示:

C = array([-1, -1, -1,  1,  2], dtype=int64)
R = array([[-2, -5],
       [-1, -5],
       [ 0, -4],
       [ 1, -3],
       [ 2, -2],
       [ 3, -1]])

提取方法:A[R.T, C]
问题:负索引给我带来了麻烦。我想为R或C或两者都〈0的条目获得NaN。这可能吗?

rggaifut

rggaifut1#

作为练习,我假设R或C数组的形状不正确(因为对于数据A[R.T, C]返回形状不匹配错误),所以我选择从R中删除一行:

import numpy as np

A = np.arange(30).reshape(5, 6)
C = np.array([-1, -1, -1,  1,  2], dtype=np.int64)
R = np.array([[-2, -5],
       [ 0, -4],
       [ 1, -3],
       [ 2, -2],
       [ 3, -1]])

然后A[R.T, C]计算为:

array([[23,  5, 11, 13, 20],
       [ 5, 11, 17, 19, 26]])

现在我假设你出于某种原因试图用NaN值替换所有由负索引提供的值,这会导致预期的结果:

array([[nan, nan, nan, 13., 20.],
       [nan, nan, nan, nan, nan]])

这是正确的预期吗?
如果是这样的话,我建议在A中添加一行和一列由NaN个值组成的行和列,并将所有的负索引替换为-1,这样就可以完成这个任务:

nan_row = np.full((1, 6), np.NAN)
nan_col = np.full((6, 1), np.NAN)
A = np.r_[A, nan_row]
A = np.c_[A, nan_col]
R[R<0] = -1
C[C<0] = -1

A[R.T, C]现在返回预期的数组:

array([[nan, nan, nan, 13., 20.],
       [nan, nan, nan, nan, nan]])

相关问题