2017-10-04 6 views
7

これは簡単なことですが、私はこれを私の頭の中で過度に複雑にしていると思います。同じ形状の2つのnumpy配列を条件付きで組み合わせる方法

ソース配列内のどの要素が大きいかによって、同じ形状の2つのソース配列から要素が生成される配列を作成したいとします。例示する

import numpy as np 
array1 = np.array((2,3,0)) 
array2 = np.array((1,5,0)) 

array3 = (insert magic) 
>> array([2, 5, 0)) 

を私は2つの配列1 /配列2要素値だけ大きいがある配列を生成する配列1および配列2の要素を組み合わせARRAY3を製造する方法を動作することはできません撮影。

ご協力いただければ幸いです。ありがとう。

答えて

18

我々はnumpyの内蔵np.maximum、その目的のために正確に作られた使用することができます -

np.maximum(array1, array2) 

もう一つの方法は、第1の軸(axis=0)に沿っ2D積み重ねられたアレイとmax-reduceにnumpyのufunc np.maxを使用することです -

100万個のデータセットに
np.max([array1,array2],axis=0) 

タイミング -

In [271]: array1 = np.random.randint(0,9,(1000000)) 

In [272]: array2 = np.random.randint(0,9,(1000000)) 

In [274]: %timeit np.maximum(array1, array2) 
1000 loops, best of 3: 1.25 ms per loop 

In [275]: %timeit np.max([array1, array2],axis=0) 
100 loops, best of 3: 3.31 ms per loop 

# @Eric Duminil's soln1 
In [276]: %timeit np.where(array1 > array2, array1, array2) 
100 loops, best of 3: 5.15 ms per loop 

# @Eric Duminil's soln2 
In [277]: magic = lambda x,y : np.where(x > y , x, y) 

In [278]: %timeit magic(array1, array2) 
100 loops, best of 3: 5.13 ms per loop 
0あなたの条件はますます複雑になっている場合
+0

AHAH。 'timeit'をありがとうございますが、標準の最適化されたnumpyの方がカスタムの方が速いことははっきりしています。私の方法はもっと複雑な条件でしか意味をなさないでしょう。 –

+1

@EricDuminilよ、まったく!ちょうど私と他の人のために、さまざまな方法がどのように積み重なっているか見てみよう。 – Divakar

12

、あなたはnp.whereを使用することができます:あなたはどんな条件でarray1 > array2を置き換えることができ

import numpy as np 
array1 = np.array((2,3,0)) 
array2 = np.array((1,5,0)) 
array3 = np.where(array1 > array2, array1, array2) 
# array([2, 5, 0]) 

。あなたが望むものが最大であれば、@ DivaCarのanswerに行ってください。

そして、ちょうど楽しみのために:

magic = lambda x,y : np.where(x > y , x, y) 
magic(array1, array2) 
# array([2, 5, 0]) 
関連する問題