回答:
x> 5のようなものをメソッドに渡すことができるということを、内部でどのように実現しますか?
簡単に言えば、そうではありません。
numpy配列に対するあらゆる種類の論理演算は、ブール配列を返します。(すなわち__gt__
、__lt__
等は全て、所与の条件が真のブール配列を返します)。
例えば
x = np.arange(9).reshape(3,3)
print x > 5
利回り:
array([[False, False, False],
[False, False, False],
[ True, True, True]], dtype=bool)
これは、がnumpy配列のif x > 5:
場合にValueErrorが発生するのと同じ理由x
です。これはTrue / False値の配列であり、単一の値ではありません。
さらに、numpy配列はブール配列によってインデックスを付けることができます。たとえば、この場合はx[x>5]
yields [6 7 8]
です。
正直なところ、実際に必要になることはほとんどありませんnumpy.where
が、ブール配列が存在するインデックスを返すだけですTrue
。通常、必要なことは単純なブールインデックスで実行できます。
__getitem__
構文を使用すると、オーバーヘッドが発生する場合もあります。以来もスライスをサポートするために持っている、いくつかのオーバーヘッドがあります。Python Pandasのデータ構造を操作し、非常に大きな列に論理的にインデックスを付ける際に、速度の顕著な違いが見られました。これらのケースでは、あなたがして、スライスを必要としない場合や、より良い実際にあります。[]
numpy.where
numpy.take
__getitem__
take
where
古い回答 それはちょっと混乱しています。それはあなたの文が真実である場所(あなたのすべて)をあなたに与えます。
そう:
>>> a = np.arange(100)
>>> np.where(a > 30)
(array([31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98,
99]),)
>>> np.where(a == 90)
(array([90]),)
a = a*40
>>> np.where(a > 1000)
(array([26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,
94, 95, 96, 97, 98, 99]),)
>>> a[25]
1000
>>> a[26]
1040
list.index()の代わりとして使用していますが、他にも多くの用途があります。2D配列で使用したことはありません。
http://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html
新しい答え その人はもっと根本的な何かを求めていたようです。
問題は、要求されたものを関数(場所など)が認識できるようにする方法を実装することでした。
最初に、比較演算子のいずれかを呼び出すと興味深いことが行われることに注意してください。
a > 1000
array([False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, True,
True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True,
True`, True, True, True, True, True, True, True, True, True], dtype=bool)`
これは、「__ gt__」メソッドをオーバーロードすることによって行われます。例えば:
>>> class demo(object):
def __gt__(self, item):
print item
>>> a = demo()
>>> a > 4
4
ご覧のとおり、「a> 4」は有効なコードです。
ここで、オーバーロードされたすべての関数の完全なリストとドキュメントを入手できます:http : //docs.python.org/reference/datamodel.html
信じられないことは、これを行うのがいかに簡単かということです。Pythonでのすべての操作は、このような方法で行われます。a> bと言うことは、aと同等です。gt(b)!
np.where(a > 30 and a < 50)
かnp.where(30 < a < 50)
、ブール値の2つの配列の論理ANDを評価しようとするため、かなり意味がありません。そのような条件を書く方法はありnp.where
ますか?
np.where((a > 30) & (a < 50))
np.where
呼び出されたnumpy ndarrayの次元に等しい長さのタプルを返します(つまり ndim
)に各項目は、条件がTrueである初期ndarray内のすべての値のインデックスのnumpy ndarrayです。(寸法と形状を混同しないでください)
例えば:
x=np.arange(9).reshape(3,3)
print(x)
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
y = np.where(x>4)
print(y)
array([1, 2, 2, 2], dtype=int64), array([2, 0, 1, 2], dtype=int64))
yは長さが2のタプルです。2であるためx.ndim
です。タプルの最初のアイテムには4より大きいすべての要素の行番号が含まれ、2番目のアイテムには4より大きいすべてのアイテムの列番号が含まれます。ご覧のとおり、[1,2,2 、2]は5、6、7、8の行番号に対応し、[2、0、1、2]は5、6、7、8の列番号に対応します。ndarrayは最初の次元(行方向)に沿ってトラバースされることに注意してください)。
同様に、
x=np.arange(27).reshape(3,3,3)
np.where(x>4)
xは3次元なので、長さ3のタプルを返します。
しかし、待ってください、np.whereにはまだまだあります!
2つの引数が追加されたとき np.where
。上記のタプルによって取得されたすべてのペアの行と列の組み合わせに対して置換操作を実行します。
x=np.arange(9).reshape(3,3)
y = np.where(x>4, 1, 0)
print(y)
array([[0, 0, 0],
[0, 0, 1],
[1, 1, 1]])
numpy.where
最初の2「の動作モード」、1を返す必要がありますindices
、condition is True
そしてオプションのパラメータ場合x
とy
(同じような形状存在しているcondition
、それはから値を返します、またはこのような形状にbroadcastableを!)x
ときcondition is True
そうでないからy
。したがって、これによりwhere
用途が広がり、より頻繁に使用できるようになります。ありがとう