क्या पाइथन या उसके किसी भी मॉड्यूल में MATLAB के conv2 फ़ंक्शन के बराबर है? अधिक विशेष रूप से, मुझे कुछ ऐसी चीज में रूचि है जो MATLAB में conv2(A, B, 'same')
के समान गणना करता है।क्या MATLAB के conv2 फ़ंक्शन के पाइथन समतुल्य है?
उत्तर
ऐसा लगता है कि scipy.signal.convolve2d वह है जिसे आप ढूंढ रहे हैं।
'वही' मोड का उपयोग करते समय, मुझे नहीं लगता कि वे वास्तव में वही हैं। मैटलैब से साइपी अलग-अलग केंद्र हैं। Matlab कहते हैं, "यदि पंक्तियों या स्तंभों की एक विषम संख्या है, तो" केंद्र "अंत में शुरुआत में एक और छोड़ देता है।" SciPy विपरीत करने के लिए प्रतीत होता है। – endolith
https://gist.github.com/4303970 – endolith
आपको मैटलैब के conv2 के परिणामों को पुन: उत्पन्न करने के लिए प्रत्येक गैर-सिंगलटन आयाम के लिए ऑफसेट प्रदान करना होगा। एक साधारण कार्यान्वयन 'एक ही' विकल्प का समर्थन, केवल, अन्य उत्तर पहले से ही एक समकक्ष के रूप में scipy.signal.convolve2d
उल्लेख हालांकि यह
import numpy as np
from scipy.ndimage.filters import convolve
def conv2(x,y,mode='same'):
"""
Emulate the function conv2 from Mathworks.
Usage:
z = conv2(x,y,mode='same')
TODO:
- Support other modes than 'same' (see conv2.m)
"""
if not(mode == 'same'):
raise Exception("Mode not supported")
# Add singleton dimensions
if (len(x.shape) < len(y.shape)):
dim = x.shape
for i in range(len(x.shape),len(y.shape)):
dim = (1,) + dim
x = x.reshape(dim)
elif (len(y.shape) < len(x.shape)):
dim = y.shape
for i in range(len(y.shape),len(x.shape)):
dim = (1,) + dim
y = y.reshape(dim)
origin =()
# Apparently, the origin must be set in a special way to reproduce
# the results of scipy.signal.convolve and Matlab
for i in range(len(x.shape)):
if ((x.shape[i] - y.shape[i]) % 2 == 0 and
x.shape[i] > 1 and
y.shape[i] > 1):
origin = origin + (-1,)
else:
origin = origin + (0,)
z = convolve(x,y, mode='constant', origin=origin)
return z
की तरह किया जा सकता है, मैंने पाया है कि परिणाम अलग जब mode='same'
का उपयोग करते हैं।
जबकि मैटलैब के conv2
छवि के निचले और दाएं भाग पर कलाकृतियों के परिणामस्वरूप scipy.signal.convolve2d
में छवि के शीर्ष और बाईं ओर एक ही कलाकृतियां हैं।
(छवियों को सीधे पोस्ट करने के लिए पर्याप्त नहीं प्रतिष्ठा) व्यवहार दिखा भूखंडों के लिए इन लिंक देखें:
Upper left corner of convoluted Barbara
Lower right corner of convoluted Barbara
निम्नलिखित आवरण बहुत ही कुशल नहीं हो सकता है, लेकिन समस्या का समाधान मेरे इनपुट में दोनों इनपुट एरे और आउटपुट सरणी को घूर्णन करके, प्रत्येक 180 डिग्री:
import numpy as np
from scipy.signal import convolve2d
def conv2(x, y, mode='same')
return np.rot90(convolve2d(np.rot90(x, 2), np.rot90(y, 2), mode=mode), 2)
क्षमा करें, मिस्ड एन-डी भाग – Anycorn
@aaa carp - कोई समस्या नहीं! धन्यवाद वैसे भी – Ryan