Python 在matplotlib中使用多个面片打印多个图像的有效方法?
我正在编写代码来显示图像之间的功能匹配。代码目前运行得相当慢。我对如何加快它有一些想法,但我对matplotlib还不是100%满意,或者它在幕后是如何工作的 代码的基本结构是:(为了使其更具可读性,我省略了一些内容)Python 在matplotlib中使用多个面片打印多个图像的有效方法?,python,performance,matplotlib,Python,Performance,Matplotlib,我正在编写代码来显示图像之间的功能匹配。代码目前运行得相当慢。我对如何加快它有一些想法,但我对matplotlib还不是100%满意,或者它在幕后是如何工作的 代码的基本结构是:(为了使其更具可读性,我省略了一些内容) 添加图像列表。每个图像都有自己的轴:ax,并记住ax.transData gs = gridspec.GridSpec( nr, nc ) for i in range(num_images): dm.ax_list[i] = plt.subplot(gs[i])
- 添加图像列表。每个图像都有自己的轴:ax,并记住ax.transData
gs = gridspec.GridSpec( nr, nc ) for i in range(num_images): dm.ax_list[i] = plt.subplot(gs[i]) dm.ax_list[i].imshow( img_list[i]) transData_list[i] = dm.ax_list[i].transData
- 将特征表示可视化为椭圆
for i in range(num_chips): axi = chips[i].axi ax = dm.ax_list[axi] transData = dm.transData_list[axi] chip_feats = chips[i].features for feat in chip_feats: (x,y,a,c,d) = feat A = numpy.array( [ ( a, 0, 0 ) , ( c, d, 0 ) , ( 0, 0, 1 ) ] , dtype=np.float64) EllShape = Affine2D( numpy.array(sqrtm( inv(A) ), dtype=np.float64) ) transEll = EllShape.translate(x,y) unitCirc = Circle((0,0),1,transform=transEll+transData) ax.add_patch(unitCirc)
- 绘制椭圆和变换圆会更有效吗?使用matplotlib转换的开销是多少李>
- 有没有一种方法可以将一组面片组合在一起,从而使它们能够一起变换或更有效地变换李>
- 将所有东西都打包到一个轴上会更有效吗?如果我这样做,转换的范例还能被使用吗?还是转型是罪魁祸首
- 有没有一种快速的方法可以在矩阵a的列表上执行sqrtm(inv(a))呢?还是我把它们放在一个for循环中就好了李>
- 我应该切换到类似pyqtgraph的东西吗?我不打算让它们成为任何超越平移和缩放的动画。(也许将来我会想把它们嵌入到一个交互式图形中)
编辑:
我已经能够通过手工计算平方根倒置矩阵的形式来提高绘图效率。这也是一个相当大的提速 在上述代码中:
A = numpy.array( [ ( a, 0, 0 ) ,
( c, d, 0 ) ,
( 0, 0, 1 ) ] , dtype=np.float64)
EllShape = Affine2D( numpy.array(sqrtm( inv(A) ), dtype=np.float64) )
A = numpy.array( [ ( a, 0, 0 ) ,
( c, d, 0 ) ,
( 0, 0, 1 ) ] , dtype=np.float64)
EllShape = Affine2D( numpy.array(sqrtm( inv(A) ), dtype=np.float64) )
被替换为
EllShape = Affine2D([\
( 1/sqrt(a), 0, 0),\
((c/sqrt(a) - c/sqrt(d))/(a - d), 1/sqrt(d), 0),\
( 0, 0, 1)])
EllShape = Affine2D([\
( 1/sqrt(a), 0, 0),\
((c/sqrt(a) - c/sqrt(d))/(a - d), 1/sqrt(d), 0),\
( 0, 0, 1)])
我还发现了一些有趣的计时结果:
num_to_run = 100000
all_setup = ''' import numpy as np ; from scipy.linalg import sqrtm ; from numpy.linalg import inv ; from numpy import sqrt
a=.1 ; c=43.2 ; d=32.343'''
timeit( \
'sqrtm(inv(np.array([ ( a, 0, 0 ) , ( c, d, 0 ) , ( 0, 0, 1 ) ])))',\
setup=all_setup, number=num_to_run)
>> 22.2588094075 #(Matlab reports 8 seconds for this run)
timeit(\
'[ (1/sqrt(a), 0, 0), ((c/sqrt(a) - c/sqrt(d))/(a - d), 1/sqrt(d), 0), (0, 0, 1) ]',\
setup=all_setup, number=num_to_run)
>> 1.10265190941 #(Matlab reports .1 seconds for this run)
num_to_run = 100000
all_setup = ''' import numpy as np ; from scipy.linalg import sqrtm ; from numpy.linalg import inv ; from numpy import sqrt
a=.1 ; c=43.2 ; d=32.343'''
timeit( \
'sqrtm(inv(np.array([ ( a, 0, 0 ) , ( c, d, 0 ) , ( 0, 0, 1 ) ])))',\
setup=all_setup, number=num_to_run)
>> 22.2588094075 #(Matlab reports 8 seconds for this run)
timeit(\
'[ (1/sqrt(a), 0, 0), ((c/sqrt(a) - c/sqrt(d))/(a - d), 1/sqrt(d), 0), (0, 0, 1) ]',\
setup=all_setup, number=num_to_run)
>> 1.10265190941 #(Matlab reports .1 seconds for this run)
编辑2 我用一个补丁集合和一些手工计算,快速地计算和绘制了椭圆(大约在一秒钟内,我没有对它进行分析)。 唯一的缺点是我似乎无法将椭圆的填充设置为false
from matplotlib.collections import PatchCollection
ell_list = []
for i in range(num_chips):
axi = chips[i].axi
ax = dm.ax_list[axi]
transData = dm.transData_list[axi]
chip_feats = chips[i].features
for feat in chip_feats:
(x,y,a,c,d) = feat
EllShape = Affine2D([\
( 1/sqrt(a), 0, x),\
((c/sqrt(a) - c/sqrt(d))/(a - d), 1/sqrt(d), y),\
( 0, 0, 1)])
unitCirc = Circle((0,0),1,transform=EllShape)
ell_list = [unitCirc] + ell_list
ellipses = PatchCollection(ell_list)
ellipses.set_color([1,1,1])
ellipses.face_color('none') #'none' gives no fill, while None will default to [0,0,1]
ellipses.set_alpha(.05)
ellipses.set_transformation(transData)
ax.add_collection(ellipses)
from matplotlib.collections import PatchCollection
ell_list = []
for i in range(num_chips):
axi = chips[i].axi
ax = dm.ax_list[axi]
transData = dm.transData_list[axi]
chip_feats = chips[i].features
for feat in chip_feats:
(x,y,a,c,d) = feat
EllShape = Affine2D([\
( 1/sqrt(a), 0, x),\
((c/sqrt(a) - c/sqrt(d))/(a - d), 1/sqrt(d), y),\
( 0, 0, 1)])
unitCirc = Circle((0,0),1,transform=EllShape)
ell_list = [unitCirc] + ell_list
ellipses = PatchCollection(ell_list)
ellipses.set_color([1,1,1])
ellipses.face_color('none') #'none' gives no fill, while None will default to [0,0,1]
ellipses.set_alpha(.05)
ellipses.set_transformation(transData)
ax.add_collection(ellipses)
我已经能够通过手工计算平方根倒置矩阵的形式来提高绘图效率。这也是一个相当大的提速 在上述代码中:
A = numpy.array( [ ( a, 0, 0 ) ,
( c, d, 0 ) ,
( 0, 0, 1 ) ] , dtype=np.float64)
EllShape = Affine2D( numpy.array(sqrtm( inv(A) ), dtype=np.float64) )
A = numpy.array( [ ( a, 0, 0 ) ,
( c, d, 0 ) ,
( 0, 0, 1 ) ] , dtype=np.float64)
EllShape = Affine2D( numpy.array(sqrtm( inv(A) ), dtype=np.float64) )
被替换为
EllShape = Affine2D([\
( 1/sqrt(a), 0, 0),\
((c/sqrt(a) - c/sqrt(d))/(a - d), 1/sqrt(d), 0),\
( 0, 0, 1)])
EllShape = Affine2D([\
( 1/sqrt(a), 0, 0),\
((c/sqrt(a) - c/sqrt(d))/(a - d), 1/sqrt(d), 0),\
( 0, 0, 1)])
我还发现了一些有趣的计时结果:
num_to_run = 100000
all_setup = ''' import numpy as np ; from scipy.linalg import sqrtm ; from numpy.linalg import inv ; from numpy import sqrt
a=.1 ; c=43.2 ; d=32.343'''
timeit( \
'sqrtm(inv(np.array([ ( a, 0, 0 ) , ( c, d, 0 ) , ( 0, 0, 1 ) ])))',\
setup=all_setup, number=num_to_run)
>> 22.2588094075 #(Matlab reports 8 seconds for this run)
timeit(\
'[ (1/sqrt(a), 0, 0), ((c/sqrt(a) - c/sqrt(d))/(a - d), 1/sqrt(d), 0), (0, 0, 1) ]',\
setup=all_setup, number=num_to_run)
>> 1.10265190941 #(Matlab reports .1 seconds for this run)
num_to_run = 100000
all_setup = ''' import numpy as np ; from scipy.linalg import sqrtm ; from numpy.linalg import inv ; from numpy import sqrt
a=.1 ; c=43.2 ; d=32.343'''
timeit( \
'sqrtm(inv(np.array([ ( a, 0, 0 ) , ( c, d, 0 ) , ( 0, 0, 1 ) ])))',\
setup=all_setup, number=num_to_run)
>> 22.2588094075 #(Matlab reports 8 seconds for this run)
timeit(\
'[ (1/sqrt(a), 0, 0), ((c/sqrt(a) - c/sqrt(d))/(a - d), 1/sqrt(d), 0), (0, 0, 1) ]',\
setup=all_setup, number=num_to_run)
>> 1.10265190941 #(Matlab reports .1 seconds for this run)
编辑2 我用一个补丁集合和一些手工计算,快速地计算和绘制了椭圆(大约在一秒钟内,我没有对它进行分析)。 唯一的缺点是我似乎无法将椭圆的填充设置为false
from matplotlib.collections import PatchCollection
ell_list = []
for i in range(num_chips):
axi = chips[i].axi
ax = dm.ax_list[axi]
transData = dm.transData_list[axi]
chip_feats = chips[i].features
for feat in chip_feats:
(x,y,a,c,d) = feat
EllShape = Affine2D([\
( 1/sqrt(a), 0, x),\
((c/sqrt(a) - c/sqrt(d))/(a - d), 1/sqrt(d), y),\
( 0, 0, 1)])
unitCirc = Circle((0,0),1,transform=EllShape)
ell_list = [unitCirc] + ell_list
ellipses = PatchCollection(ell_list)
ellipses.set_color([1,1,1])
ellipses.face_color('none') #'none' gives no fill, while None will default to [0,0,1]
ellipses.set_alpha(.05)
ellipses.set_transformation(transData)
ax.add_collection(ellipses)
from matplotlib.collections import PatchCollection
ell_list = []
for i in range(num_chips):
axi = chips[i].axi
ax = dm.ax_list[axi]
transData = dm.transData_list[axi]
chip_feats = chips[i].features
for feat in chip_feats:
(x,y,a,c,d) = feat
EllShape = Affine2D([\
( 1/sqrt(a), 0, x),\
((c/sqrt(a) - c/sqrt(d))/(a - d), 1/sqrt(d), y),\
( 0, 0, 1)])
unitCirc = Circle((0,0),1,transform=EllShape)
ell_list = [unitCirc] + ell_list
ellipses = PatchCollection(ell_list)
ellipses.set_color([1,1,1])
ellipses.face_color('none') #'none' gives no fill, while None will default to [0,0,1]
ellipses.set_alpha(.05)
ellipses.set_transformation(transData)
ax.add_collection(ellipses)
您可以将所有椭圆放入一个补丁集合中,这样也可以加快绘图速度。您可以试试
PathCollection
?这是相同的想法,但与路径,而不是补丁。还可以尝试添加kwargmatch\u original=True
(),我找到了一种更简单的方法。您可以将修补程序集合的facecolor设置为字符串:“无”。(注意,如果使用None,则不起作用,然后它只是默认值)是的,'None'
是字符串对象,None
是None
对象。对不起,我应该仔细考虑一下我之前的评论。你能把你最后的评论作为一个解决方案,因为你似乎已经解决了你自己的问题吗?