2013-05-16 32 views
5

के हिस्से पर पुनरावृत्ति को गति कैसे करें मेरे पास numpy में एक बड़ा 3 आयामी सरणी है (कहें आकार 100x100x100 कहें)। मैं इसके कई हिस्सों (लगभग 70% तत्वों) पर फिर से शुरू करना चाहता हूं और मेरे पास एक बुलियन मैट्रिक्स है जो एक ही आकार है और यह परिभाषित करता है कि तत्व को ऑपरेशन किया जाना चाहिए या नहीं।एक numpy सरणी

मेरे वर्तमान विधि आकार की एक सरणी "coords" (एन, 3) जो सभी coords जिस पर संचालन करने के लिए और फिर

for i in np.arange(many_iterations): 
    for j in coords: 
     large_array[j] = do_something(large_array[tuple(j)]) 

यह वास्तव में बेहतर होगा शामिल बनाने के लिए पहला है पूरे सरणी का मूल्यांकन करने के लिए और बूलियन सरणी का परीक्षण करने के लिए लूप में एक अतिरिक्त ऑपरेशन शामिल करें (ध्यान रखें कि सच्चाई मूल्यांकन तब एक से अधिक बार कई बार किया जाता है)। मेरे बारे में सोचा कि इस मामले में भुगतान बंद छोरों

large_array = do_something(large_array if condition True) 

कैसे इस अंतिम पंक्ति इस मामले में काम करने के लिए किया जाएगा के लिए से छुटकारा पाने की जाएगी था?

+0

'do_something' क्या है, इस पर निर्भर करता है कि आप' big_array [boolean_array] = do_something (big_array [boolean_array]) ', या कुछ कम अभी भी कर सकते हैं। –

+0

मुझे लगता है कि आपकी भावना सही है, यह पूरे सरणी पर ऑपरेशन करने के आपके लाभ के लिए हो सकता है और फिर 'numpy.where' जैसे कुछ का उपयोग करें। –

उत्तर

3

आप पहली बार बूलियन्स की एक सरणी को परिभाषित जहां आप व्यवसाय चलाते चाहिए बनाने के द्वारा बेहतर प्रदर्शन प्राप्त हो सकता है:

big_3d_arr = some 100x100x100 array 
where_to_operate_arr = big_3d_arr < 500 # or whatever your condition is 
big_3d_arr[where_to_operate_arr] = do_something(big_3d_arr[where_to_operate_arr]) 

कुछ ऐसे ही काम हो सकता है, लेकिन फिर आप पुनरावृति करने के लिए है और मात्रा में बूलियन अनुक्रमण ऐसा कर सकते हैं , आपके आवेदन के आधार पर।

+0

धन्यवाद यह वही है जो मुझे चाहिए था। do_something एक ऐसा फ़ंक्शन है जो सरणी के प्रत्येक तत्व को प्राप्त करता है और इसे अपने आस-पास के तत्वों का औसत बनाता है (ऐसा करने के लिए कि मैं सरणी की प्रतिलिपि बना रहा हूं और फिर सरणी को ऑफ़सेट करने और जोड़ने के लिए np.roll की एक श्रृंखला का उपयोग कर रहा हूं)। मैंने अंत में मास्क के खिलाफ फैसला किया क्योंकि मैं अभी भी मास्क किए गए डेटा का उपयोग कर रहा हूं और यह इस समाधान से थोड़ा अधिक जटिल लग रहा था। – Rowan

3

आप मूल रूप से masked arrays को फिर से बनाने की कोशिश कर रहे हैं। This पृष्ठ एक अच्छा परिचय देता है।