除了子类化(例如从list
)之外,如何使python对象隐式地转换为ndarray
?你知道吗
示例:
import numpy
arg=[0,1,2]
numpy.dot(arg,arg) # OK, arg is converted to ndarray
#Looks somewhat array like, albeit without support for slices
class A(object):
def __init__(self, x=0,y=1,z=2):
(self.x,self.y,self.z)=(x,y,z)
def __getitem__(self, idx):
if idx==0:
return self.x
elif idx==1:
return self.y
elif idx==2:
return self.z
else:
raise IndexError()
def __setitem__(self, idx, val):
if idx==0:
self.x=val
elif idx==1:
self.y=val
elif idx==2:
self.z=val
else:
raise IndexError()
def __iter__(self):
for v in (self.x,self.y,self.z):
yield v
# Is there a set of functions I can add here to allow
# numpy to convert instances of A into ndarrays?
arg=A()
numpy.dot(arg,arg) # does not work
错误:
>>> scipy.dot(a,a) # I use scipy by default
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/home/dave/tmp/<ipython-input-9-f73d996ba2b6> in <module>()
----> 1 scipy.dot(a,a)
TypeError: unsupported operand type(s) for *: 'A' and 'A'
它正在调用array(arg)
,但是会产生一个类似[arg,]
的数组,它是shape==()
,所以dot
尝试将A
实例相乘。你知道吗
到ndarray
的转换需要复制数据,这是可以的(事实上是预期的)。你知道吗
__len__
似乎是关键特性:只需添加使班级在
numpy.dot
中工作。你知道吗相关问题 更多 >
编程相关推荐