2013-05-31 17 views
6

私はブール値を与えられたベクトルの最大値を取得しようとしています。 numpyのでTheano:この場合、インデックス作成が失敗するのはなぜですか?

>>> this = np.arange(10) 
>>> this[~(this>=5)].max() 
4 

しかしTheanoと:

>>> that = T.arange(10, dtype='int32') 
>>> that[~(that>=5)].max().eval() 
9 
>>> that[~(that>=5).nonzero()].max().eval() 
Traceback (most recent call last): 
    File "<pyshell#146>", line 1, in <module> 
    that[~(that>=5).nonzero()].max().eval() 
AttributeError: 'TensorVariable' object has no attribute 'nonzero' 

これはなぜ起こるのでしょうか?これは私が紛失している微妙なニュアンスですか?

+0

/あなたがnumpy配列を使用するのと同じ方法でそれを使用することはできません。 –

+0

@JeffTratner:ウェブサイトで提供されている[例](http://deeplearning.net/software/theano/library/tensor/basic.html#indexing)に反対するもの... –

+1

@NoobSailbotはあなたが右を使用していますかバージョン? –

答えて

9

あなたは古すぎるTheanoのバージョンを使用しています。実際、tensor_var.nonzero()はリリースされたバージョンにはありません。開発版に更新する必要があります。

>>> that[~(that>=5).nonzero()].max().eval() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: bad operand type for unary ~: 'tuple' 

あなたの行に括弧が欠落しているので、これは次のとおりです。私はこれを持っている開発バージョンでは

。ここでは良いラインは次のとおりです。

>>> that[(~(that>=5)).nonzero()].max().eval() 
array(9, dtype=int32) 

しかし、我々はまだ予想外の結果を持っています!問題は、Theanoがboolをサポートしていないことです。 int8で〜を実行すると、1ビットではなく8ビットでビット反転を行います。これは、この結果を与える:

>>> (that>=5).eval() 
array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1], dtype=int8) 
>>> (~(that>=5)).eval() 
array([-1, -1, -1, -1, -1, -2, -2, -2, -2, -2], dtype=int8) 

はあなたが削除することができますが、これに〜:

>>> that[(that<5).nonzero()].max().eval() 
array(4, dtype=int32) 
さて、2番目のリテラルトレースバックが配列で `ゼロでない()`メソッドを持っていないことを言っている
+1

良いこと、ありがとう。しかし、私はあなたが「開発版」を意味するのか少し混乱しています。それは私が読んでいる "最先端"ですか?それは実験的ではないと思われますか? –

+0

nonzero()はTheano 0.7リリースの一部です – sim

+0

@nouiz、私はちょうどあなたのすばらしい答え+1のために100万のお礼を言いたいと思います。 –

関連する問題