2017-02-04 9 views
2

1から100の範囲のnp配列(シリーズ?)を持っています。どちらの配列も同じ長さです。私はarray2 [i]> array1 [i]の場合は1、array2 [i] = array1 [i]の場合は0、array2 [i]の場合は-1,array1 [i]なら-1を作成したいと思います。Pythonの他の配列の値の条件付き論理に基づいて配列を作成します。

私はforループといくつかの "if"ステートメントを使って簡単にこれを行うことができますが、処理時間は余裕があります。

私はこれを書いた方法を許してください、私は非常にpythonに新しいとstackoverflowで質問しています。あなたの助けが大変ありがとうございます。

array1 = [1,2,3,4,5,6,7,8,9,10] 
array2 = [5,8,2,4,9,3,0,2,8,5] 
array3 = [1,1,-1,0,1,-1,-1,-1,-1,-1] 
+0

両方の配列の例を追加できますか? – Nils

+0

array1 = [1,2,3,4,5,6,7,8,9,10]、array2 = [5,8,2,4,9,3,0,2,8,5]、array3このようにする必要があります= [1,1、-1,0,1、-1、-1、-1、-1、-1] –

答えて

1

はおそらく、より高速なアプローチがありますが、一つの選択肢は、ちょうどそのnumpy.clip違いは、あなたの比較基準を形成するために、第二から最初の配列を差し引くことであろう。

>>> arr1 = np.array([1, 5, -3, 2, 7]) 
>>> arr2 = np.array([-4, 5, 3, 0, 7]) 
>>> np.clip(arr2-arr1, -1, 1) 
array([-1, 0, 1, -1, 0]) 

編集:クリッピングは、理由のnp.signsee DSM's answer必要はありません。

+0

これは私のソリューションより約30%高速です。 –

4
import numpy as np 

a = np.array([1,2,3,4,5,6,7,8,9,10]) 
b = np.array([5,8,2,4,9,3,0,2,8,5]) 

r = 1*(b > a) - (b < a) # multiplying by one converts boolean array to int array 
print(r) # [ 1 1 -1 0 1 -1 -1 -1 -1 -1] 
+0

これは賢いです – miradulo

+0

素晴らしい、それはトリックを行う必要があるように見える、非常に迅速な返信に感謝! –

+0

@Mitch、私はあなたのソリューションがはるかに好きだった。 –

3

また、マスクを使用することができます。

array1 = [1,2,3,4,5,6,7,8,9,10] 
array2 = [5,8,2,4,9,3,0,2,8,5] 

result = np.zeros(10) 
# use masks 
result[array2>array1 ] = 1 
result[array2 ==array1 ] = 0 
result[array2<array1 ] = -1 

print(result) # [1,1,-1,0,1,-1,-1,-1,-1,-1] 
7

は、これが0に1、ゼロに正の数をオンされ、np.signのために良いユースケースのように思える、と-1に負:

>>> array1 = np.array([1,2,3,4,5,6,7,8,9,10]) 
>>> array2 = np.array([5,8,2,4,9,3,0,2,8,5]) 
>>> np.sign(array2-array1) 
array([ 1, 1, -1, 0, 1, -1, -1, -1, -1, -1]) 
+0

TIL 'np.sign'は事です。これははるかに良い答えです。 – miradulo

+0

受賞者がいます。 :) –

+0

私はそれが助けてくれてありがとう、この単純なことができると思った。 –

関連する問題