修改numpy数组以在超出范围时返回NAN?

5
有没有办法创建一个numpy数组,当索引越界时返回np.nan?例如:
x = np.array([1,2,3])
x[1] # 2
x[-2] # np.nan
x[5] # np.nan

我找到的最接近的东西是 np.pad

我知道我可以编写一个包装类,但我想知道是否有任何高效的numpy方法来实现它。


3
x[-2] 是有效的,对吧?NumPy 支持负数下标。你想覆盖这个功能吗? - Vishnu Dasu
1
这似乎是scipy的人们需要添加到numpy中的内容。我不认为numpy有这个选项。但是,您可以使用try和except,如果未找到索引,则返回np.nan或类似的内容。那是我现在能想到的唯一的事情。 - Amit Amola
@J.Doe:不行。在numpy中,负索引是有效的。 - blue_note
为什么要提到负索引?据我所知,x[-5]x[5] 一样会抛出 IndexError 异常。 - Jeppe
1
啊,我明白了,你想禁用负索引。在这种情况下,我认为你需要一个包装器,就像这个答案中所示,并且在__getitem__中,你可以手动或使用try/except检查索引是否越界。我不认为你可以monkeypatch一个np.ndarray - Jeppe
显示剩余2条评论
2个回答

1
In [360]: x = np.array([1,2,3])                                                                        
In [361]: x[1]                                                                                         
Out[361]: 2

np.take 允许您使用模式控制进行索引。默认情况下,如果索引超出范围,它会引发错误(有关其他选项,请参见文档):

In [363]: np.take(x,1)                                                                                 
Out[363]: 2
In [364]: np.take(x,-2)                                                                                
Out[364]: 2
In [365]: np.take(x,5)                                                                                 
----
IndexError: index 5 is out of bounds for size 3

你可以编写一个小函数,将其包装在 try/except 中,在出现 IndexError 的情况下返回 np.nan
请记住,np.nan 是一个浮点数,而你的示例数组是整数类型。

-1

你有很多选择:

  • 在你的代码中插入try/except语句。
  • 创建一个继承自np.array的类,并重新定义索引运算符以实现所需行为。
  • 编写一个简单的函数来执行try/except操作。

我喜欢第二个选项,即创建一个类。


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