मैं इस सरणी को परिवर्तित कर रहा हूँ:

x = np.array([[0, 0, 1], [1, 1, 0], [0, 1, 0], [1, 0, 0], [0, 0, 0]])

को: [2, 0, 1, 0, 0]

मूल रूप से, मैं प्रत्येक उप-सरणी में पहले 1 की अनुक्रमणिका वापस करना चाहता हूं। हालांकि, मेरी समस्या यह है कि मुझे नहीं पता कि उस परिदृश्य को कैसे संभालना है जहां कोई 1 नहीं है। मैं चाहता हूं कि यह 0 वापस आ जाए यदि 1 नहीं मिला है (जैसे मेरे उदाहरण में)।

नीचे दिया गया कोड ठीक काम करता है लेकिन मेरे द्वारा बताए गए परिदृश्य के लिए IndexError: index 0 is out of bounds for axis 0 with size 0 फेंकता है:

np.array([np.where(r == 1)[0][0] for r in x])

इसे संभालने का एक आसान तरीका क्या है? इसे numpy.where तक सीमित रखने की आवश्यकता नहीं है।

मैं वैसे भी पायथन 3 का उपयोग कर रहा हूं।

0
CH123 25 अक्टूबर 2017, 14:37

2 जवाब

सबसे बढ़िया उत्तर

आपके कोड में एक साधारण संशोधन सूची समझ में एक शर्त जोड़ना होगा:

np.array([np.where(r == 1)[0][0] if 1 in r else 0 for r in x])
# 23.1 µs ± 43.2 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

समान परिणाम प्राप्त करने का एक अधिक संक्षिप्त और काफी तेज़ तरीका है:

np.argmax(x == 1, axis=1)
# 4.04 µs ± 45.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

या, समकक्ष:

np.argmin(x != 1, axis=1)
# 4.03 µs ± 13.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
1
norok2 25 अक्टूबर 2017, 15:03

mask का 1s और फिर argmax का प्रयोग करें ताकि वैध पंक्तियों (कम से कम एक 1 वाली पंक्तियों की जांच के लिए any के साथ पहला मिलान सूचकांक प्राप्त किया जा सके। ) -

mask = x==1
idx = np.where(mask.any(1), mask.argmax(1),0)

अब, argmax सभी पर False, 0 वापस आ जाएगा। तो, यह सही बताई गई समस्या के हाथों में खेलता है। जैसे, हम केवल mask.argmax(1) परिणाम का उपयोग कर सकते हैं। लेकिन एक सामान्य मामले में, जहां अमान्य विनिर्देशक, इसे invalid_val 0 नहीं कहते हैं, हम वहां np.where के अंदर निर्दिष्ट कर सकते हैं, जैसे -

idx = np.where(mask.any(1), mask.argmax(1),invalid_val)

एक और तरीका यह होगा कि मास्क पर पहला मिलान सूचकांक प्राप्त करें और फिर मास्क में अनुक्रमणिका देखें कि क्या कोई अनुक्रमित मान False है और उन्हें 0s के रूप में सेट करें -

idx = mask.argmax(1)
idx[~mask[np.arange(len(idx)), idx]] = 0 # or invalid_val
2
Divakar 25 अक्टूबर 2017, 15:10