从序列内部正确转换为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;它不会因为无效索引而提高索引器。哦,谢谢。又学到了一些新的东西——这将修正我的答案。