从序列内部正确转换为ndarray的Numpy可转换类?

从序列内部正确转换为ndarray的Numpy可转换类?,numpy,Numpy,\uuuuu数组\uuuu方法允许自定义类型自动转换为numpy。例如: >>> class Convertible: ... def __array__(self): ... return np.zeros(7) >>> np.array(Convertible()) array([ 0., 0., 0., 0., 0., 0., 0.]) 不幸的是,如果自定义类型出现在序列中,\uuuuuuuuuuuuuuuuuuuuuuuuuuuu

\uuuuu数组\uuuu
方法允许自定义类型自动转换为numpy。例如:

>>> class Convertible:
...  def __array__(self):
...    return np.zeros(7)
>>> np.array(Convertible())
array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.])
不幸的是,如果自定义类型出现在序列中,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
将不起作用:

>>> 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'
np.array([Convertible(),Convertible()]) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:float()参数必须是字符串或数字,不能为“可转换”
有没有一种方法可以修复
可转换的
,以便将
可转换的
对象序列转换为具有
np.array
的numpy,这与转换每个对象,然后转换生成的
ndarrays
序列是一样的?

它必须是一个序列

numpy.array

数组、公开数组接口的任何对象、其
\uuuuuuuuuuu\uuuuuu
方法返回数组的对象或任何(嵌套的)序列

Convertible
实例上调用
numpy.array
时,您点击的是“其
\uuuuuuuuuuuuu数组方法返回数组的对象”案例。当您在可转换列表中调用它时,您遇到的是“任意(嵌套)序列”情况。类型推断逻辑似乎在使用您在确定新数组的数据类型时定义的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法,但在此之后,由于您的对象不提供序列协议,NumPy假设您的对象应该直接转换为int


实现
\uuuu len\uuuuu
\uuuu getitem\uuuuuuu
,您应该能够将
[Convertible(),Convertible()]
转换为数组。但是,当您这样做时,NumPy将使用sequence协议而不是
\uuuu数组\uuuu
,这将涉及比您可能希望的更多的Python方法调用。如果要防止这种情况发生,您必须执行直接
numpy.array
调用以外的操作。

您的对象也必须是可编辑的。以下代码

import numpy as np

class Convertible:
    def __array__(self):
        return np.zeros(7)

    def __iter__(self):
        for i in range(7):
            yield 0    

    def __len__(self):
        return 7

    def __getitem__(self, n):
        if n > 6:
            raise IndexError('index out of range')
        return 0


print(np.array(Convertible()))
print()
print(list(Convertible()))
print()
print(np.asarray((Convertible(),Convertible())))
为我工作:

[0. 0. 0. 0. 0. 0. 0.]

[0, 0, 0, 0, 0, 0, 0]

[[0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0.]]

如何“修复”它?您必须指定预期行为,因为这里有几个选项。编辑文本以明确表示我想要自然行为。
np.stack([convertable(),convertable()])
应该生成一个(2,7)个零数组。这是真的,但它回避了目标,即我想要
[convertable(),convertable()]
作为
\uuuuuuu数组\uuuuuu
的参数。啊,你比我强:)不过,看起来你还需要定义`\uuuuuuu iter\uuuuuu'方法。至少对我来说,代码似乎挂起了。@ThomasKühn:那是因为你的
\uu getitem\uuu
有一个bug;它不会因为无效索引而提高索引器。哦,谢谢。又学到了一些新的东西——这将修正我的答案。