广播函数调用np.array

时间:2013-04-04 02:49:23

标签: python class object numpy numpy-broadcasting

我正在尝试创建一个充满对象的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,但似乎没有任何效果。

2 个答案:

答案 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']