2017-10-04 37 views
7

Bu kulağa basit geliyor, ve bence bunu aklımda karıştırıyorum.Aynı şekildeki iki sayısal dizgiyi koşullu olarak birleştirmek için:

Öğeleri, kaynak dizisindeki hangi öğenin daha büyük olduğuna bağlı olarak, aynı şekildeki iki kaynak dizisinden oluşturulmuş bir dizi oluşturmak istiyorum.

göstermek için:

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

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

iki Dizi1/array2 elemanı değerlerinin büyük olduğu, sadece bir dizi üretmek için dizi1 ve dizi2 elemanlarını birleştiren bir array3 üretmek için nasıl çalışamaz alınmış.

Herhangi bir yardım çok takdir edilecektir. Teşekkürler.

cevap

18

Biz NumPy yerleşik np.maximum, bu amaçla tam olarak yapılmış kullanabilirsiniz -

np.maximum(array1, array2) 

başka yolu da ilk eksen (axis=0) boyunca 2D yığılmış dizisi ve max-reduce tarihinde NumPy ufunc np.max kullanmak olacaktır -

1000000 veri kümeleri üzerinde
np.max([array1,array2],axis=0) 

Zamanlamaları -

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 Durumunuz daha da karmaşık hale gelirse
+0

Ahah. 'Timeit' için teşekkürler, ancak standart, optimize edilmiş numpy yolunun özel olandan daha hızlı olduğu oldukça açık. Benim yöntemim sadece daha karmaşık bir durumla anlamlı olur. –

+1

@EricDuminil Yup tamamen! Sadece kendim ve başkaları için çeşitli yöntemlerin nasıl yığıldığını görmeye çalışıyorum. – Divakar

12

, sen np.where kullanabilirsiniz: Herhangi koşulu ile array1 > array2 yerini alabilecek

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]) 

. İstediğiniz maksimum ise, @ Divakar'ın answer ile gidin.

Ve sadece eğlence için

:

magic = lambda x,y : np.where(x > y , x, y) 
magic(array1, array2) 
# array([2, 5, 0]) 
İlgili konular