2010-02-25 13 views
9

के बीच सामान्य तत्व सूचकांक लौटें मेरे पास दो सरणी, ए 1 और ए 2 हैं। len(a2) >> len(a1) मानें, और यह ए 1 ए 2 का सबसेट है।दो numpy arrays

मुझे ए 1 में सभी तत्वों के ए 2 सूचकांक वापस करने का एक त्वरित तरीका चाहिए। ऐसा करने का समय-गहन तरीका स्पष्ट रूप से है:

from operator import indexOf 
indices = [] 
for i in a1: 
    indices.append(indexOf(a2,i)) 

यह निश्चित रूप से एक लंबा समय लगता है जहां ए 2 बड़ा है। मैं numpy.where() के बजाय भी उपयोग कर सकता हूं (हालांकि ए 1 में प्रत्येक प्रविष्टि केवल 2 में दिखाई देगी), लेकिन मुझे विश्वास नहीं है कि यह तेज़ होगा। मैं भी सिर्फ एक बार बड़ी सरणी पार कर सकता है:

for i in xrange(len(a2)): 
    if a2[i] in a1: 
     indices.append(i) 

लेकिन मुझे यकीन है कि वहाँ एक तेजी से, अधिक 'numpy' तरीका है - मैं numpy विधि सूची के माध्यम से देखा है, लेकिन कुछ भी उचित नहीं मिल रहा।

अग्रिम में बहुत धन्यवाद,

डी

उत्तर

8

कैसे

के बारे में
numpy.nonzero(numpy.in1d(a2, a1))[0] 

यह तेजी से होना चाहिए। मेरे मूल परीक्षण से, यह len(a2) == 100, len(a1) == 10000, और सूचकांक 45 पर केवल एक आम तत्व के लिए आपके दूसरे कोड स्निपेट की तुलना में लगभग 7 गुना तेज है। यह मानता है कि a1 और a2 दोनों में दोहराने वाले तत्व नहीं हैं।

+0

मैंने डेव किर्बी के ऊपर अपने समाधान की तुलना की, यह लेन के लिए लगभग 1.35 एक्स तेज है (ए 2) == 12347424, लेन (ए 1) == 1338, इसलिए इस समाधान को मेरा वोट मिल गया - धन्यवाद! – Dave

+3

इसे पढ़ने वाले किसी के लिए: ऐसा लगता है कि 'setmember1d' का नाम बदलकर शून्य में 1.4 में बदल दिया गया है। –

+0

@AlokSinghal इसे पकड़ने के लिए धन्यवाद! –

2

तरीके के बारे में:

wanted = set(a1) 
indices =[idx for (idx, value) in enumerate(a2) if value in wanted] 

यह होना चाहिए ओ (लेन (A1) + लेन (A2)) हे के बजाय (लेन (A1) * लेन (ए 2))

एनबी मुझे numpy नहीं पता है, इसलिए ऐसा करने के लिए एक और 'numpythonic' तरीका हो सकता है, लेकिन इस तरह मैं इसे शुद्ध पायथन में करूँगा।

+0

क्या यह गणना (ए 2) होना चाहिए? – Dave

+0

ओह, मेरे बुरे। इसे अभी तय करें। –

0

numpy_indexed पैकेज (अस्वीकरण: मैं उसके लेखक हूँ) list.index के एक vectorized बराबर होता है; प्रदर्शन वर्तमान में स्वीकृत उत्तर के समान होना चाहिए, लेकिन बोनस के रूप में, यह आपको 'लापता' kwarg का उपयोग करके लापता मूल्यों पर भी स्पष्ट नियंत्रण देता है।

import numpy_indexed as npi 
indices = npi.indices(a2, a1, missing='raise') 

इसके अलावा, यह भी बहुआयामी सरणियों, यानी पर काम करेंगे, किसी अन्य रूप में पंक्तियों का एक सेट के सूचकांकों की खोज।

1

@AlokSinghal के समान ही है, लेकिन आप पहले से ही एक व्यापक संस्करण प्राप्त करते हैं।

numpy.flatnonzero(numpy.in1d(a2, a1)) 
संबंधित मुद्दे