numpy.r_
hereの numpy/scipy doc によると、「関数ではないため、パラメーターを取りません」。
関数ではない場合、 などの「関数」の適切な用語は何numpy.r_
ですか?
私は、すべての目的のために関数であると主張しますr_
が、異なる構文を使用した巧妙なハックによって実装された関数です。Miker_
は、 が実際には関数ではなく、実装されRClass
ているのクラス インスタンスであると説明__getitem__
したので、 として使用できますr_[1]
。外見上の違いは、曲線の代わりに角括弧を使用しているため、関数呼び出しを行っていませんが、実際にはオブジェクトにインデックスを付けていることです。これは技術的には真実ですが、すべての目的で関数呼び出しと同じように機能しますが、通常の関数では許可されていない追加の構文を使用できます。
作成の動機は、r_
おそらく、Matlab の構文に由来します。これにより、配列を非常にコンパクトな方法で構築できますx = [1:10, 15, 20:10:100]
。numpy で同じことを達成するには、x = np.hstack((np.arange(1,11), 15, np.arange(20,110,10)))
. コロンを使用して範囲を作成することは python では許可されていませんが、リストにインデックスを付けるためのスライス表記の形式で存在しL[3:5]
ますA[2:10, 20:30]
。内部的には、これらのインデックス表記は__getitem__
オブジェクトのメソッドへの呼び出しに変換され、コロン表記はスライスオブジェクトに変換されます。
In [13]: class C(object):
...: def __getitem__(self, x):
...: print x
In [14]: c = C()
In [15]: c[1:11, 15, 20:110:10]
(slice(1, 11, None), 15, slice(20, 110, 10))
オブジェクトはr_
この事実を「悪用」して、スライス表記を受け入れる「関数」を作成します。これは、すべてを連結して結果を返すなどの追加のことも行うため、x = np.r_[1:11, 15, 20:110:10]
. ドキュメントの「関数ではないため、パラメーターを取りません」は少し誤解を招きます...
これはクラス インスタンス (別名オブジェクト) です。
In [2]: numpy.r_
Out[2]: <numpy.lib.index_tricks.RClass at 0x1923710>
クラスは、個別の型を定義するために使用される構成体です。そのようなクラスは、それ自体のインスタンスを許可します。各インスタンスは、プロパティ (メンバー/インスタンス変数およびメソッド) を持つことができます。
クラスが持つことができるメソッドの 1 つはメソッドです。これは、インスタンスの名前に__getitem__
追加するたびに呼び出されます。[something,something...something]
インスタンスのnumpy.r_
場合、メソッドは numpy 配列を返します。
たとえば、次のクラスを見てください。
class myClass(object)
def __getitem__(self,i)
return i*2
上記のクラスの次の出力を見てください。
In [1]: a = myClass()
In [2]: a[3]
Out[2]: 6
In [3]: a[3,4]
Out[3]: (3, 4, 3, 4)
私は__getitem__
myClass のメソッドを ([]
かっこを介して) 呼び出しており、__getitem__
メソッドは返されています (リストの内容 * この場合は 2)-関数として動作するクラス/インスタンスではありません-それはインスタンスの__getitem__
関数ですmyClass
が呼び出されています。
最後に、インスタンス化するmyClass
には私がしなければならなかったa = myClass()
のに対し、あなたのインスタンスを取得するにはこれRClass
を使用する必要があることに気付くでしょう。これは、numpy ソース コードの関連する行です。私の意見では、これはかなり醜く、混乱を招きます。numpy.r_
RClass