该__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?
它必须是一个序列。
numpy.array 需要
数组,公开数组接口的任何对象,
__array__方法返回数组的对象或任何(嵌套)序列。
当你调用numpy.array一个Convertible实例,你打的“的对象,它的__array__方法返回一个数组”的情况。当您在“敞篷车”列表上调用它时,您遇到的是“任何(嵌套)序列”案例。__array__在确定新数组的dtype时,类型推断逻辑似乎正在使用您定义的方法,但是在那之后,由于您的对象不提供序列协议,因此NumPy假定您的对象应直接转换为int。
实施__len__和__getitem__,您应该能够转换[Convertible(), Convertible()]为数组。但是,NumPy将使用序列协议,而不是__array__在您使用序列协议时使用,这将涉及比您可能想要的更多的Python方法调用。numpy.array如果要防止这种情况,除了直接呼叫外,您还必须执行其他操作。
| 归档时间: |
|
| 查看次数: |
134 次 |
| 最近记录: |