2013-01-17 38 views
7

में फ़ंक्शन मैटलैब ढूंढें क्या find(A>9,1) के बराबर फ़ंक्शन numpy/scipy के लिए matlab से है। मुझे पता है कि nonzero numpy में फ़ंक्शन है लेकिन मुझे जो चाहिए वह पहली अनुक्रमणिका है ताकि मैं किसी अन्य निकाले गए कॉलम में पहली अनुक्रमणिका का उपयोग कर सकूं।numpy/scipy

पूर्व: A = [ 1 2 3 9 6 4 3 10 ] find(A>9,1) matlab

+0

तुम्हारा मतलब '> =' करते हैं? क्योंकि '>' वापस आ जाएगा 8. –

+1

वास्तव में, numpy arrays शून्य आधारित हैं, इसलिए '9' स्थिति' 3' और '10' स्थिति में' 10' है। – Jaime

उत्तर

5

numpy में find के बराबर nonzero है में सूचकांक 4 वापसी होगी, लेकिन यह एक दूसरा पैरामीटर का समर्थन नहीं करता। लेकिन आप जिस व्यवहार को ढूंढ रहे हैं उसे पाने के लिए आप ऐसा कुछ कर सकते हैं।

B = nonzero(A >= 9)[0] 

लेकिन अगर सभी आप देख रहे हैं पहला तत्व है कि एक शर्त को संतुष्ट करता लगाना है, लेकिन आप max का उपयोग कर बेहतर कर रहे हैं।

उदाहरण के लिए, मैटलैब में, find(A >= 9, 1)[idx, B] = max(A >= 9) जैसा ही होगा। Numpy में समकक्ष कार्य निम्नलिखित होगा।

idx = (A >= 9).argmax() 
1

matlab के find(X, K) मोटे तौर पर अजगर में numpy.nonzero(X)[0][:K] के बराबर है। @ पवन के argmax विधि शायद एक अच्छा विकल्प है, तो K == 1 है, लेकिन जब तक आप apriori जानते हैं कि वहाँ एक> = 9 में एक मूल्य के लिए किया जाएगा, तो आप शायद कुछ ऐसा करने की आवश्यकता होगी:

idx = (A >= 9).argmax() 
if (idx == 0) and (A[0] < 9): 
    # No value in A is >= 9 
    ... 
1

मैं इन यकीन सभी महान जवाब हैं लेकिन मैं उनका उपयोग करने में सक्षम नहीं था। हालांकि, मुझे एक और धागा मिला जो आंशिक रूप से इसका उत्तर देता है: MATLAB-style find() function in Python

जॉन ने निम्नलिखित कोड पोस्ट किया है जो आपके मामले में ए> 9 --- ढूंढें (ए> 9,1) - लेकिन दूसरा तर्क नहीं।

मैं जॉन कोड जो मैं दूसरा तर्क के लिए खातों का मानना ​​है ", 1"

def indices(a, func): 
    return [i for (i, val) in enumerate(a) if func(val)] 
a = [1,2,3,9,6,4,3,10] 
threshold = indices(a, lambda y: y >= 9)[0] 

यह सीमा = 3 रिटर्न में बदलाव किए। मेरी समझ यह है कि पायथन की अनुक्रमणिका 0 से शुरू होती है ... तो यह matlab कहने के बराबर है 4. आप ब्रैकेट्स यानी [1], [2], आदि में संख्या को बदलकर बुलाए जाने वाले इंडेक्स का मूल्य बदल सकते हैं। [0]।

जॉन मूल कोड:

def indices(a, func): 
    return [i for (i, val) in enumerate(a) if func(val)] 

a = [1, 2, 3, 1, 2, 3, 1, 2, 3] 

inds = indices(a, lambda x: x > 2) 

जो रिटर्न >>> inds [2, 5, 8]

0

अजगर में argwhere का उपयोग कर MATLAB के find समारोह को बदलने के लिए विचार करें। उदाहरण के लिए,

import numpy as np 
A = [1, 2, 3, 9, 6, 4, 3, 10] 
np.argwhere(np.asarray(A)>=9)[0][0] # Return first index 

रिटर्न 3.