2011-11-18
*1321604904*Numpyのndarrayは空でなくても偽になる
Pythonのリストの場合、ifの条件式に入れてboolに変換された場合は日本語で言うと「空かどうか」になる。
||
if []: print not empty
not empty
False True
||
でもNumpyのndarrayはそうではない。
||
print bool(array([])), bool(array(0)) False False
||
これは、ndarrayは「1要素で中身が0の時にはゼロである」と設計されているせい。
||
False
||
Pythonのリストの挙動とは整合しないけど、まあゼロベクトルがゼロと判定されるのはアリかなぁ、などと思ったが…
||
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
||
えっ。
*1321611727*NumPyで特定の条件を満たす行、列を除去する方法
NumPyではスライシングで特定の条件を満たす要素だけ選択できる。逆の条件で使えば特定の要素だけ除去するのも簡単。
|python|
array(range(5))
v = _
||
これは「v != 2」の部分で演算子がオーバーロードされていて、真偽値のarrayになっている。だからこれは他のarrayに対しても使える。
|python|
v != 2
randn(5)
||
ベクトルが縦になっているなら1つ目の軸に「:」(全部)を指定して2番目にスライスを指定すればよい。
|python|
randn(5).reshape(1, 5)
array(-0.86985953, 0.59620319, -1.25975869, 1.87290875, -0.44375606)
array(-0.86985953, 0.59620319, 1.87290875, -0.44375606)
||
|python|
array(range(25)).reshape(5, 5)
mat = _
||
単純に行と列の両方にこのスライシングを指定したらいいんじゃないか?って思うけどこれは間違い。対角成分だけになってしまう。
|python|
||
片方をスライスしてからもう片方をスライスすればOK。
|python|
||