2017-07-08 15 views
2

私はMatlabのコードをPythonに変換しています。 Matlabのコードは次のとおりです。matlabのfind()をpythonに変換する

x = find(sEdgepoints > 0 & sNorm < lowT); 
sEdgepoints(x)=0; 

両方の配列が同じサイズであり、基本的にマスクを作成しています。

私はnumpyのnonzero()がfind()と同等であることをhereと読んでいます。 Pythonでは、私はsEdgepointsのdstcとsNormのdstを持っています。 /)私はa.any(の使用について読ん

Traceback (most recent call last): 
File "C:\Python27\Sheet Counter\customsobel.py", line 32, in <module> 
    x = np.nonzero(dstc > 0 and dst < 60) 
ValueError: The truth value of an array with more than one element is 
ambiguous. Use a.any() or a.all() 

:私も直接のでlowT = 60に入れ、コードが

x = np.nonzero(dstc > 0 and dst < 60) 
dstc[x] = 0 

だった。しかし、私はエラーを以下の取得があります。すべて()in this post、そして私はそれがどのように動作するのか分かりません。だから、私は2つの質問があります: 1.もしそうなら、どのアレイを使うのですか? 2.私が正しく、動作しない場合、コードをどのように変換するのですか?

答えて

1

andは、ブール演算を行い、あなたが&すなわち

を使用する必要がありますので、numpyのは、あなたがビット単位の操作を行うことを期待
x = np.nonzero((dstc > 0) & (dst < 60)) 
1

np.argwhere() を試してみてください(と不平等の周りの()の重要性に注意してください):

>>X=np.array([1,2,3,4,5]) 
>>Y=np.array([7,6,5,4,3]) 
>>ans = np.argwhere((X>3) & (Y<7)) 
>>ans 

array([[3], 
    [4]]) 
+0

これはうまくいきますが、私の評判が十分でないため、申し訳ありません。ありがとう! – Epsilon7

+0

全く問題ありません - 私もそこにいました。あなたが解決策を持ってうれしい! – qbzenker

0

あなた自身が好きで、それを実現することができます。

x = [[i,j] for i, j in zip(sEdgepoints , sNorm) if i > 0 and j < lowT] 

はあなたのリストのリストを与えますあなたの一致する制約に対応します。 これはまさにあなたが探しているものではないかもしれないと思います。

たぶんパンダモジュールを見て、それは、プレーンのpythonまたはnumpyのよりも快適マスキングなります: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.mask.html

関連する問題