कुशल numpy मूल्य के असाइनमेंट के माध्यम से बूलियन मुखौटा

0

सवाल

मैं एक बूलियन मुखौटा मूल्य बताए समस्या की आवश्यकता है कुशल बूलियन मुखौटा आपरेशन ।

यह एक बहु-आयाम मुखौटा और मैं का उपयोग कर रहा हूँ einsum परिणाम प्राप्त करने के लिए, लेकिन आपरेशन बहुत कुशल नहीं है, और मैं सोच रहा हूँ, अगर मैं कुछ प्राप्त कर सकते हैं मदद के साथ यह यहाँ मेरे वर्तमान समाधान: (दोनों mask, truth_value, false_value कर रहे हैं डमी डेटा के साथ dtype और आकार से मेल खाता करने के लिए मेरी समस्या नहीं है ।

mask = np.random.randn(1000, 50)> 0.5
truth_value = np.random.randn(50, 10)
false_value = np.random.randn(10)
objective = np.einsum('ij,jk->ijk', mask, truth_value) + np.einsum('ij,k->ijk', ~mask, false_value)

वहाँ है किसी भी तेजी से रास्ता पाने के लिए objective दिया mask, truth_value, false_value ?

जबकि मैं इंतज़ार कर रहा था, समझ से बाहर एक तेजी से रास्ते

objective = np.where(mask[...,np.newaxis], np.broadcast_to(truth_value, (1000, 50, 10)), np.broadcast_to(false_value,  (1000, 50, 10)))

लेकिन वहाँ है किसी भी तेजी से विकल्प है ?

mask numpy python
2021-11-21 23:00:26
1

सबसे अच्छा जवाब

0

आप का उपयोग कर सकते हैं Numba JIT करने के लिए है कि और अधिक कुशलता से.

import numpy as np
import numba as nb

@nb.njit('float64[:,:,::1](bool_[:,::1], float64[:,::1], float64[::1])')
def blend(mask, truth_value, false_value):
    n, m = mask.shape
    l = false_value.shape[0]
    assert truth_value.shape == (m, l)
    result = np.empty((n, m, l), dtype=np.float64)
    for i in range(n):
        for j in range(m):
            if mask[i, j]:
                result[i, j, :] = truth_value[j, :]
            else:
                result[i, j, :] = false_value[:]
    return result

mask = np.random.randn(1000, 50) > 0.5
truth_value = np.random.randn(50, 10)
false_value = np.random.randn(10)
objective = blend(mask, truth_value, false_value)

गणना के objective है 4.8 गुना तेजी से अपनी मशीन पर.

यदि यह तेजी से पर्याप्त नहीं है, आप कर सकते हैं की कोशिश करने के लिए parallelize को कोड का उपयोग कर पैरामीटर parallel=True और का उपयोग कर nb.prange के बजाय range मैं में आधारित पाश. यह नहीं हो सकता है तेजी के कारण भूमि के ऊपर बनाने के नए सूत्र. मेरे मशीन पर (6 कोर), समानांतर संस्करण 7.4 गुना तेजी से (के निर्माण के धागे बहुत महंगा है की तुलना में निष्पादन के समय).

एक अन्य संभावित अनुकूलन करने के लिए सीधे लिखने के परिणाम में एक बफर आवंटित समय के आगे (यह केवल बेहतर है, तो आप इस समारोह में कॉल के साथ कई बार एक ही सरणी के आकार के) ।

यहाँ कुल मिलाकर समय पर मेरे मशीन:

np.einsum:         4.32 ms
np.where:          1.72 ms
numba sequential:  0.89 ms
numba parallel:    0.58 ms
2021-11-21 23:52:43

धन्यवाद! यह वास्तव में तेजी से einsum समाधान! एक छोटा सा तेजी से np.where +np.broadcast_to आधारित समाधान है ।
yupbank

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................