我正在尝试创建一个充满对象的NumPy数组,我想知道是否有一种方法可以向每个对象广播整个数组来做某事。
代码:
class player:
def __init__(self,num = 5):
self.num = num
def printnum():
print(self.num)
...
objs = np.array([player(5),player(6)],dtype=Object)
objs.printnum()
目前,这会返回错误。我已经尝试根据手册将dtype更改为:_object,但似乎没有任何效果。
答案 0 :(得分:0)
代码中的拼写错误:printnum()
需要self
arg,Object
- > object
class player:
def __init__(self, num=5):
self.num = num
def printnum(self):
print(self.num)
objs = np.array([player(5),player(6)], dtype=object)
# It's not a "broadcast" (what you mean is map), but it has the same result
# plus it's pythonic (explicit + readable)
for o in objs:
o.printnum()
看起来你真正想做的是创建一个生成器对象。 Google python generator yield
您将获得this
答案 1 :(得分:0)
numpy对象数组不会继承该对象的方法。 ndarray
方法通常作用于整个数组
这对于内置类型也不起作用,例如:
In [122]: import numpy as np
In [123]: n = 4.0
In [124]: a = np.arange(n)
In [125]: n.is_integer()
Out[125]: True
In [126]: a.is_integer()
---------------------------------------------------------------------------
AttributeError: 'numpy.ndarray' object has no attribute 'is_integer'
Numpy广播是通过逐元素运算符完成的,例如补充:
In [127]: n
Out[127]: 4.0
In [128]: a
Out[128]: array([ 0., 1., 2., 3.])
In [129]: n + a
Out[129]: array([ 4., 5., 6., 7.])
如果您希望基本上对数组中的所有元素调用print
,则只需重新定义.__repr__()
调用的print
方法即可。我会提醒您,通过覆盖该方法会丢失信息。
In [148]: class player:
.....: def __init__(self, num=5):
.....: self.num = num
.....: def __repr__(self):
.....: return str(self.num)
.....:
In [149]: objs = np.array([player(5), player(6)])
In [150]: objs
Out[150]: array([5, 6], dtype=object)
In [151]: print objs
[5 6]
即使它看起来像这样,但这与np.array([5,6])
不同:
In [152]: objs * 3
----------------------
TypeError: unsupported operand type(s) for *: 'instance' and 'int'
在那里你可以看到覆盖__repr__
的缺点。
更简单的方法是使用当前的printnum()
方法,但是在循环中调用它:
In [164]: class player:
.....: def __init__(self, num=5):
.....: self.num = num
.....: def printnum(self):
.....: print(self.num)
.....:
In [165]: for p in objs:
.....: p.printnum()
.....:
5
6
或者,也许定义你的方法来返回一个字符串而不是打印一个字符串,然后进行列表理解:
In [169]: class player:
.....: def __init__(self, num=5):
.....: self.num = num
.....: def printnum(self):
.....: return str(self.num)
.....:
In [170]: objs = np.array([player(5), player(6)])
In [171]: [p.printnum() for p in objs]
Out[171]: ['5', '6']