2013-10-07 19 views
5

में ऑर्डर वेक्टर ढूंढें मुझे एक numpy.array में एक वेक्टर खोजने की आवश्यकता है। उदाहरण के लिए, मेरे पास एक np.array नाम ई है और मैं ई में वेक्टर [1, 2] खोजना चाहता हूं (जिसका अर्थ है कि मैं मैट्रिक्स के अंदर वेक्टर की अनुक्रमणिका रखना चाहता हूं) लेकिन स्पष्ट रूप से मेरे प्रोग्राम वेक्टर को देखते हैं यहाँ तक कि जब मौजूद नहीं है:numpy array

enter image description here

कोड मैं निम्नलिखित में बनाया ई करने के लिए उपयोग करें:

import numpy as np 
faces = np.array([[1,2,3,4],[5,6,2,1],[6,7,3,2],[7,8,4,3],[8,5,1,4],[8,7,6,5]]) 
e = np.zeros([6,4,2]) 
for k in range(len(faces)): 
    a = [faces[k][0], faces[k][1]] 
    b = [faces[k][1], faces[k][2]] 
    c = [faces[k][2], faces[k][3]] 
    d = [faces[k][3], faces[k][0]] 
    e[k] = np.array([a,b,c,d]) 
print('e: %s' %e) 

किसी भी सुराग कि यह कैसे हल करने के लिए?

+2

कोड सहित सहायक था। छवि अनावश्यक है; बस टेक्स्ट फॉर्म में आपके द्वारा की गई सामग्री शामिल करें। –

+0

अगली बार, मैं टिप के लिए धन्यवाद करूँगा। – JAWE

उत्तर

3

प्रयास करें:

e[np.all((e-np.array([1,2]))==0, axis=2)] 

संक्षिप्त विवरण। e-np.array([1,2])[0,0] देता है जहां यह सरणी e में है। np.all(..., axis=2 बूलियन सरणी देता है: True यदि [0,0]False अन्यथा (इसलिए [1,1] जैसी चीजें गलत हो जाएंगी)। अंत में, बस इसे ई से टुकड़ा करें।

प्राप्त करने के लिए [1,2] के के सूचकांक (एक से अधिक उप वेक्टर [1,2] हो सकता है):

np.argwhere(np.all((e-array([1,2]))==0, axis=2)) 
+0

यह ठीक वैसे ही काम करता है जैसा मुझे चाहिए! सिर्फ एक नोट: मुझे चेतावनी मिलती है कि तर्क कहां एक अपरिभाषित नाम है (मैं अजगर 2.7.5 का उपयोग कर रहा हूं) मुझे कुछ पैकेट आयात करने की आवश्यकता हो सकती है लेकिन यह निश्चित रूप से कोई समस्या नहीं है, धन्यवाद! – JAWE

+0

हां, आप सही हैं। यदि आपके पास 'numpy import * से' नहीं था, तो उसे 'np.argwhere' होना होगा। संपादित। –

3

NumPy सरणी के साथ अजगर in प्रयोग न करें।

e में 6 x 4 जोड़े हैं।

In [32]: e.shape 
Out[32]: (6, 4, 2) 

आपको कोई ऐसा तत्व है कि जोड़ी [1, 2] में दोनों (अर्थात, all()) प्रविष्टियों से मेल खाता देख रहे हैं।

In [33]: (e == np.array([1, 2])).all(-1) 
Out[33]: 
array([[ True, False, False, False], 
     [False, False, False, False], 
     [False, False, False, False], 
     [False, False, False, False], 
     [False, False, False, False], 
     [False, False, False, False]], dtype=bool) 

-1all(-1) में सरणी में पिछले आयाम, आकार कि जोड़े के गठन का हिस्सा संदर्भित करता है। -1 का उपयोग करना संभवतः 2 का उपयोग करने से अधिक सामान्य है, जो इस मामले में भी काम करेगा।

यह सही मिलान मिला - केवल True मूल्य। आप देख सकते हैं कि इस परिणाम का आकार समझ में आता है।

In [34]: (e == np.array([1, 2])).all(-1).shape 
Out[34]: (6, 4) 

प्राप्त करने के लिए पहले मैच की सूचकांक तुम कर सकते हो

x, y = (e == np.array([1, 2])).all(-1).argmax(1).argmax(), (e == np.array([1, 2])).all(-1).argmax(0).argmax() 

लेकिन np.argwhere सीटी झू के जवाब में सुझाव का उपयोग कर निश्चित रूप से बेहतर है।

+0

लेकिन फिर मैं सही मूल्य की अनुक्रमणिका कैसे ले सकता हूं? क्षमा करें, मैं एक नौसिखिया हूँ। – JAWE

+0

जब मैं एक अलग वेक्टर की तलाश में हूं [1,4] यह सही परिणाम नहीं देता है: x = (e == np.array ([1, 4]))। सभी (-1) .र्गमिन (1) .र्गमैक्स() वाई = (ई == एनपी.एरे ([1, 4]))। सभी (-1) .र्गमिन (0) .र्गमैक्स() वापसी x = 0, y = 0..hyhy ?? – JAWE

+0

मेरी गलती। संपादित उत्तर देखें। मुझे हर मामले में 'argmax'' होना चाहिए (कभी भी 'argmin'') नहीं होना चाहिए। एक बूलियन सरणी पर, 'argmax'' का अर्थ है "पहले' 'सत्य' मान का सूचकांक।" उदाहरण के लिए, '' (ई == एनपी.एरे ([1, 4]))। सभी (-1) .argmax (0) .argmax() '' 2, ठीक से देता है। –

0

यह ई के सभी सूचकांक मुद्रित करेगा और यह [1,2] के बराबर होगा। यदि आप इंडेक्स को वापस प्रिंट करना चाहते हैं, तो उन्हें प्रिंट करने के बजाय, आप (num, num2) को किसी अन्य सूची में जोड़ सकते हैं, और इससे आपको [1,2] के सभी स्थान मिलेंगे। अधिक स्तरों के सरणी के साथ काम करने के लिए विस्तारित करने की आवश्यकता होगी।

for num, item in enumerate(e): 
    for num2, item2 in enumerate(item):          
     print ('e[{i}][{j}]: {truth}'.format(i=num, 
              j=num2, 
              truth = (item2 == [1,2]).all())) 

आउटपुट:

e = np.ascontiguousarray(e) 
dt = np.dtype((np.void, e.dtype.itemsize * e.shape[-1])) 
e_view = e.view(dt) 
search = np.array([1, 2], dtype=e.dtype).view(dt) 

अब आप np.in1d साथ पदों निकाल सकते हैं:

e[0][0]: True                           
e[0][1]: False                           
e[0][2]: False                           
e[0][3]: False                           
e[1][0]: False                           
e[1][1]: False                           
e[1][2]: False                           
e[1][3]: False                           
e[2][0]: False                           
e[2][1]: False                           
e[2][2]: False                           
e[2][3]: False                           
e[3][0]: False                           
e[3][1]: False                           
e[3][2]: False                           
e[3][3]: False                           
e[4][0]: False                           
e[4][1]: False                           
e[4][2]: False                           
e[4][3]: False                           
e[5][0]: False                           
e[5][1]: False                           
e[5][2]: False                           
e[5][3]: False 
+0

और यदि मैं मैच के बाद तत्व मुद्रित करना चाहता था? (या इसे एक चर में सहेजने के लिए) – JAWE

+0

सुनिश्चित नहीं है कि मुझे काफी सवाल है, लेकिन आप इसका उपयोग कर सकते हैं: https://gist.github.com/garth5689/6870607 मूल रूप से, बस कोशिश करने और खोजने के लिए कोई आइटम जोड़ें अगला तत्व, और इसे प्रिंट स्ट्रिंग में जोड़ें। यह 'इंडेक्स एरर्स' पर कोई भी प्रिंट नहीं करेगा। – Garth5689

+0

धीमी पायथन लूप से बचने के लिए numpy का उपयोग करने का लाभ पहला स्थान है। –

2

तुम भी np.void dtype के एकल आइटम के रूप में अपने वैक्टर देखने पर निम्नलिखित चाल का उपयोग कर सकते हैं:

mask = np.in1d(e_view, search) 
indices = np.unravel_index(np.where(mask), e.shape[:-1]) 

>>> indices 
(array([[0]], dtype=int64), array([[0]], dtype=int64)) 

रिटर्न एरे search की घटनाओं की पंक्तियों और स्तंभों के साथ एक टुपल है, इस मामले में केवल (0, 0) पर केवल एक ही है।