numpy-convertible类可以从序列内部正确转换为ndarray吗?

Geo*_*ing 3 numpy

__array__方法允许自定义类型自动转换为numpy。例如,

>>> class Convertible:
...  def __array__(self):
...    return np.zeros(7)
>>> np.array(Convertible())
array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.])
Run Code Online (Sandbox Code Playgroud)

不幸的是,__array__如果自定义类型出现在序列中,则无法使用:

>>> np.array([Convertible(), Convertible()])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: float() argument must be a string or a number, not 'Convertible'
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以解决Convertible,以将Convertible对象序列转换为numpy与np.array转换每个对象然后转换结果序列相同ndarrays

use*_*ica 5

它必须是一个序列。

numpy.array 需要

数组,公开数组接口的任何对象,__array__方法返回数组的对象或任何(嵌套)序列。

当你调用numpy.array一个Convertible实例,你打的“的对象,它的__array__方法返回一个数组”的情况。当您在“敞篷车”列表上调用它时,您遇到的是“任何(嵌套)序列”案例。__array__在确定新数组的dtype时,类型推断逻辑似乎正在使用您定义的方法,但是在那之后,由于您的对象不提供序列协议,因此NumPy假定您的对象应直接转换为int。

实施__len____getitem__,您应该能够转换[Convertible(), Convertible()]为数组。但是,NumPy将使用序列协议,而不是__array__在您使用序列协议时使用,这将涉及比您可能想要的更多的Python方法调用。numpy.array如果要防止这种情况,除了直接呼叫外,您还必须执行其他操作。

  • @ThomasKühn:那是因为您的`__getitem__`有一个错误;它不会为无效索引引发`IndexError`。 (2认同)