【问题标题】:numpy ndarray indexing with __index__ method使用 __index__ 方法的 numpy ndarray 索引
【发布时间】:2019-03-15 21:36:48
【问题描述】:

当使用自定义类实例作为索引时,我不明白 numpy ndarray 的索引是如何工作的。

我有以下代码:

import numpy as np

class MyClass:
    def __index__(self):
        return 1,2

foo = np.array([[1,2,3],[4,5,6]])
bar = MyClass()

print(foo[1,2])
print(foo[bar])

我希望从两个打印函数中得到相同的结果 (6)。但是从第二个开始,类实例被用作索引,我收到一个错误:

IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

如果我显式调用 __index__ 方法

print(foo[bar.__index__()])

它有效。但这违背了魔法方法的目的。

如果我只用一个索引调用数组,一切正常:

import numpy as np

class MyClass:
    def __index__(self):
        return 1

foo = np.array([[1,2,3],[4,5,6]])
bar = MyClass()

print(foo[1])
print(foo[bar])

>>> [4 5 6]
>>> [4 5 6]

所以我没有得到:

  • ndarray 可以将 __index__ 方法的输出用于多个维度。显式调用时可见。
  • ndarray 确实对 __index__ 方法进行了整理。见第二个例子。
  • 但由于某种原因,这不能同时工作。为什么?

是我遗漏了什么,还是 ndarray 不支持这种索引?


我只想补充一点,__index__ 方法如何输出其结果显然并不重要。我试过了:

return a, b
return (a, b)
return tuple((a, b))

它们都不适合我。

【问题讨论】:

  • 实现__index__的意思是“我的对象代表一个整数,__index__的返回值就是它代表的整数”。它并不意味着你认为它意味着什么。
  • 是的,所以在我的例子中,我的对象表示二维空间中的坐标,非常类似于普通向量。我现在想使用这个对象来获取 ndarray 的特定元素。我认为这是正确的方法。但这只能用于单个整数,不能用于多个整数吗?

标签: python arrays numpy indexing magic-methods


【解决方案1】:

如前所述here、__index__方法Must return an integer.

这就是为什么你的尝试没有奏效,而“一个索引”的例子却奏效了。

【讨论】:

  • 谢谢,我不知道__index__ 必须返回一个整数才能工作。因为一个ndarray可以处理多个索引,并且可以显式调用该方法,所以我希望这两个可以结合起来。在我看来会非常方便。不过没关系。
猜你喜欢
  • 2018-10-10
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2016-01-15
  • 2015-09-14
  • 1970-01-01
  • 2018-02-15
  • 2015-12-13
相关资源
最近更新 更多