2017-10-04 24 views
7

यह आसान लगता है, और मुझे लगता है कि मैं इसे अपने दिमाग में अतिसंवेदनशील कर रहा हूं।सशर्त रूप से एक ही आकार के दो numpy arrays को गठबंधन कैसे करें

मैं एक सरणी बनाना चाहता हूं जिसका तत्व एक ही आकार के दो स्रोत सरणी से उत्पन्न होता है, इस पर निर्भर करता है कि स्रोत सरणी में कौन सा तत्व अधिक है।

वर्णन करने के लिए:

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

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

मैं बाहर काम नहीं कर सकता है कि कैसे एक array3 कि array1 और array2 के तत्वों एक सरणी का निर्माण करने के जहां केवल दो array1/array2 तत्व मूल्यों का अधिक से अधिक है को जोड़ती है निर्माण करने के लिए लिया।

किसी भी मदद की बहुत सराहना की जाएगी। धन्यवाद।

उत्तर

18

हम NumPy निर्मित np.maximum, उस उद्देश्य के लिए वास्तव में किया जाता इस्तेमाल कर सकते हैं -

np.maximum(array1, array2) 

एक और तरीका है एक 2D खड़ी सरणी और max-reduce पहले अक्ष (axis=0) साथ पर NumPy ufunc np.max उपयोग करने के लिए हो सकता है -

1 लाख डेटासेट पर
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

AHAH। 'टाइमिट' के लिए धन्यवाद, लेकिन यह स्पष्ट है कि मानक, अनुकूलित संख्यात्मक तरीका एक कस्टम से तेज है। मेरी विधि केवल एक जटिल स्थिति के साथ समझ में आएगी। –

+1

@EricDuminil Yup पूरी तरह से! बस यह देखने की कोशिश कर रहा है कि मेरे और दूसरों के लिए भी विभिन्न विधियां कैसे खड़ी हैं। – Divakar

12

अपनी हालत कभी अधिक जटिल हो जाता है, तो आप np.where इस्तेमाल कर सकते हैं:

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

आप किसी भी शर्त के साथ array1 > array2 बदल सकते थे। यदि आप चाहते हैं कि अधिकतम है, तो @ दिवाकर के answer के साथ जाएं।

और सिर्फ मनोरंजन के लिए:

magic = lambda x,y : np.where(x > y , x, y) 
magic(array1, array2) 
# array([2, 5, 0]) 
संबंधित मुद्दे