आप सहसंबंध का उपयोग कर सकते हैं। आपको अपने काले मानों को -1 और अपने सफेद मानों को 1 (या इसके विपरीत) पर सेट करने की आवश्यकता होगी ताकि आप सहसंबंध की चोटी के मूल्य को जान सकें, और यह केवल सही अक्षर के साथ होता है।
निम्नलिखित कोड मैं क्या लगता है कि आप चाहते हैं करता है।
import numpy
from scipy import signal
# Set up the inputs
a = numpy.random.randn(100, 200)
a[a<0] = 0
a[a>0] = 255
b = numpy.random.randn(20, 20)
b[b<0] = 0
b[b>0] = 255
# put b somewhere in a
a[37:37+b.shape[0], 84:84+b.shape[1]] = b
# Now the actual solution...
# Set the black values to -1
a[a==0] = -1
b[b==0] = -1
# and the white values to 1
a[a==255] = 1
b[b==255] = 1
max_peak = numpy.prod(b.shape)
# c will contain max_peak where the overlap is perfect
c = signal.correlate(a, b, 'valid')
overlaps = numpy.where(c == max_peak)
print overlaps
यह (array([37]), array([84]))
, ऑफसेट कोड में सेट के स्थानों को आउटपुट।
आपको शायद यह पता चलेगा कि यदि आपका बड़ा आकार आपके बड़े सरणी आकार से गुणा हुआ है तो मोटे तौर पर नोग्ल (एन) से बड़ा है, जहां एन उस बड़े सरणी का आकार है जिसमें आप खोज रहे हैं (प्रत्येक आयाम के लिए), फिर आप शायद scipy.signal.fftconvolve
(- flipud
और fliplr
मन में असर है कि आप एक संबंध की तुलना में एक घुमाव के उपयोग कर रहे हैं बल्कि डेटासेट में से एक के प्रत्येक अक्ष फ्लिप करने की आवश्यकता होगी) की तरह एक fft आधारित एल्गोरिदम के उपयोग द्वारा गति को मिल जाएगा।
c = signal.fftconvolve(a, numpy.fliplr(numpy.flipud(b)), 'valid')
ऊपर आकार पर समय की तुलना:
In [5]: timeit c = signal.fftconvolve(a, numpy.fliplr(numpy.flipud(b)), 'valid')
100 loops, best of 3: 6.78 ms per loop
In [6]: timeit c = signal.correlate(a, b, 'valid')
10 loops, best of 3: 151 ms per loop
स्रोत
2012-06-18 08:54:16
वाह, महान जवाब! मुझे चलाने के लिए कुछ परीक्षण मिल गए हैं। – DaveO
मेरे साथ कुछ हुआ, आप 0 को मान सेट करके अपने सबमिट्रिक्स के क्षेत्रों को "परवाह नहीं करते" कर सकते हैं। इसका मतलब है कि उन मानों का पार-सहसंबंध पर कोई प्रभाव नहीं पड़ेगा। 'Max_peak' मान को' max_peak = b [b! = 0] .size' के रूप में पाया जा सकता है (यह काम करेगा कि आपके पास 0 मान हैं या नहीं)। –
इसलिए मैंने दोपहर को अपना कोड संपादित कर लिया है और इसे काम कर लिया है! आइए मान लें कि 2 घटनाएं 2x3 आकार (सरणी ([0, 6]), सरणी ([1, 7]) पर पाए गए हैं) जिसका अर्थ है ऊपरी बाएं कोने [0, 1] और [6, 7] हैं। मैं जो करना चाहता हूं वह आकार के सभी 2x3 कोशिकाओं को अनुक्रमणित करने में सक्षम होना है और उन्हें अगले आकार पर 0 असाइन करना है, जिसे हम ढूंढ रहे हैं, हम छवि के उस भाग (ऊपर आपकी टिप्पणी के अनुसार) की जांच नहीं करेंगे। लूप का उपयोग किए बिना 2 डी आकार को इंडेक्स करने के लिए मैं सहसंबंध/fftconvolve के वापसी मूल्य का उपयोग कैसे कर सकता हूं? एक सूची-स्थान-स्थान टुकड़ा का क्रमबद्ध करें। – DaveO