2016-04-12 5 views
0

私は3465 x 50157のNumPy行列を持っており、行列の選択された列の各固有の値をしきい値として使用して特定の計算をテストしようとしています。この、numpyのは私に次のエラーを与えている実行している場合スカラーの代わりにNumPy unique()を返す

feat_num = 4 
thresholds = np.unique(X[:, feat_num]) 

for thresh in thresholds: 
    y_left = np.array([ 
     y[i] for i in range(X.shape[0]) if X[i, feat_num] < thresh 
    ]) 

:次の例を考えてみましょう

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all(). 

私はX[i, feat_num]がスカラーであることを確認しているので、そこには問題がありません。しかし、なんらかの理由でthreshが何らかの配列に評価されています。 Xが整数の単なる大きな行列であることを考えれば、私はこれがどうなるか分かりません。

誰でも何が起こっているか見てみましょうか?

+0

yとは何ですか?またはあなたの質問にはXだけが1つの配列形状が記述されています –

+0

そして 'thresh'はスカラーですか? – hpaulj

答えて

0

問題はおそらく、numpyではなくmatrixのnumpyを使用している可能性があります。ndarray後者はより一般的な獣です。私はそれらを使用することをお勧めします。 matrixタイプの利点の1つは、行列から期待されるように代数演算が動作することですが、これはほとんど必要ではなく、その場合でもを使用してndarrayオブジェクトで動作させることができます。

matrixの列スライスは、matrixという形の(N,1)(これはリストのリストと同じです)の列ベクトルです。あなたの元の配列がndarrayだった場合、それは次のようになり、つまり、その列のスライスは、形状(N,)を持っているでしょう1Dはなく、実際の列ベクトルより(フラットリストとの互換性)ndarray

>>> import numpy as np 
>>> X = np.random.rand(3,3) 
>>> Xmat = np.asmatrix(X) 
>>> 
>>> print(X[:,1]) 
[ 0.28797057 0.56186287 0.58674852] 
>>> print(Xmat[:,1]) 
[[ 0.28797057] 
[ 0.56186287] 
[ 0.58674852]] 

列ベクトル上でループますあなたの期待に反する、スカラーではなくリストを与える。

どこでも行列操作を使用しない場合は、np.arrayオブジェクトに切り替えることを強くお勧めします。これも現在の問題を解決するはずです。

関連する問題