python
menyediakan pelbagai skema lilitan Sebagai perbandingan, fungsi lilitan yang ditakrifkan dalam ndimage
lebih berfungsi daripada numpy
dan signal
Konvolusi dalam adalah lebih rumit sedikit. , yang boleh dilihat hanya daripada bilangan parameter input
numpy.convolve(a, v, mode='full') scipy.ndimage.convolve1d(input, weights, axis=-1, output=None, mode='reflect', cval=0.0, origin=0) scipy.signal.convolve(in1, in2, mode='full', method='auto') scipy.ndimage.convolve(input, weights, output=None, mode='reflect', cval=0.0, origin=0)
Dua yang pertama ialah fungsi konvolusi 1 dimensi, dan ndimage boleh melakukan tatasusunan berbilang dimensi di sepanjang paksi koordinat tunggal menjalankan operasi konvolusi, dan dua yang terakhir ialah lilitan pelbagai dimensi.
Fungsi lilitan dalam numpy dan isyarat mempunyai tiga mod, yang digunakan untuk melaraskan ciri tepi selepas lilitan Jika dimensi dua objek lilitan input ialah N NN dan M MM, maka Hasil keluaran ini tiga mod ialah
full
: Dimensi output ialah N + M &tolak; bertindih, jadi kesan tepi adalah jelas.
same
: Dimensi output maks ( M , N ) maks(M,N)max(M,N), kesan tepi masih kelihatan
valid
: Dimensi output ∣ M &tolak; N ∣ |M-N|∣M&tolak;N∣, hanya mengembalikan kawasan bertindih sepenuhnya, yang bersamaan dengan menghapuskan kadar mata dengan kesan tepi
ndimage
dalam convolve
mengembangkan imej untuk kesan tepi, dan mode
nya menentukan format pelapik selepas pengembangan Katakan tatasusunan yang akan ditapis ialah a b c d
, kemudian dalam Dalam berbeza mod, tepi diisi seperti berikut
左侧填充 | 数据 | 右侧填充 | |
---|---|---|---|
reflect | d c b a | a b c d | d c b a |
constant | k k k k | a b c d | k k k k |
nearest | a a a a | a b c d | d d d d |
mirror | d c b | a b c d | c b a |
wrap | a b c d | a b c d | a b c d |
, dengan k
ditetapkan oleh parameter cval
.
Lima kaedah mengubah suai sempadan ini sangat biasa dalam fungsi scipy.ndimage
, terutamanya fungsi penapis yang melibatkan lilitan, yang merupakan standard.
Seterusnya, lakukan ujian prestasi untuk fungsi lilitan yang berbeza ini, menggunakan templat 5 &kali; pada kelajuan lilitan dalam pelaksanaan berbeza
import numpy as np import scipy.signal as ss import scipy.ndimage as sn from timeit import timeit A = np.random.rand(1000,1000) B = np.random.rand(5,5) timeit(lambda : ss.convolve(A, B), number=10) # 0.418 timeit(lambda : sn.convolve(A, B), number=10) # 0.126
Sebagai perbandingan, lilitan dalam ndimage
jelas lebih cekap.
Seterusnya, mari kita uji prestasi lilitan satu dimensi
A = np.random.rand(10000) B = np.random.rand(15) timeit(lambda : np.convolve(A, B), number=1000) # 0.15256029999727616 timeit(lambda : ss.convolve(A, B), number=1000) # 0.1231262000001152 timeit(lambda : sn.convolve(A, B), number=1000) # 0.09218210000108229 timeit(lambda : sn.convolve1d(A, B), number=1000) # 0.03915820000111125
Sebagai perbandingan, convolve1d
sememangnya fungsi lilitan yang menyatakan dengan jelas 1d
, dan merupakan yang terpantas, manakala < The fungsi yang disediakan dalam 🎜> adalah yang paling perlahan. numpy
from scipy.misc import ascent import matplotlib.pyplot as plt img = ascent() temp = np.zeros([3,3]) temp[:,0] = -1 temp[:,2] = 1 edge = sn.convolve(img, temp) fig = plt.figure() ax = fig.add_subplot(121) ax.imshow(img) ax = fig.add_subplot(122) ax.imshow(edge) plt.show()
Atas ialah kandungan terperinci Cara menggunakan fungsi lilitan Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!