オブジェクトの 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']