小编Fak*_*DIY的帖子

Matplotlib和Pyplot.close()没有释放内存? - 后端相关的Qt4Agg

编辑:如果我明确地将matplotlib的后端从'Qt4Agg'更改为'Agg',那么我能够运行我的代码而没有错误.我认为这是后端的一个错误?

我正在编写一些代码来自动处理相当大量的数据.代码首先解析我的数据文件并存储所有相关的位.然后,我有不同的功能来生成我需要的每个图形(总共大约有25个).但是,我一直遇到某种内存错误,我认为这是因为Matplotlib/PyPlot没有正确释放内存.

每个绘图函数都以pyplot.close(fig)命令结束,因为我只想保存图形而不立即查看它们,所以它们包含pyplot.show().

如果我在翻译中单独运行绘图功能,那么我不会遇到任何问题.但是,如果我创建一个单独调用每个绘图函数的函数,那么我会遇到"MemoryError:无法为路径分配内存".

有人遇到过这样的问题吗?在绘制循环时,似乎与Matplotlib内存不足有关,但pyplot.close()无法解决我的问题.

这是我的代码中典型的绘图函数:

def TypicalPlot(self, title=None, comment=False, save=False, show=True):

    if title is None:
        title = self.dat.title

    fig = plt.figure()
    host = SubplotHost(fig, 111)
    fig.add_subplot(host)
    par = host.twinx()
    host.set_xlabel("Time (hrs)")
    host.set_ylabel("Power (W)")
    par.set_ylabel("Temperature (C)")
    p1, = host.plot(self.dat.timebase1, self.dat.pwr, 'b,', label="Power",
                    markevery= self.skip)
    p2, = par.plot(self.dat.timebase2, self.dat.Temp1, 'r,', 
                   label="Temp 1", markevery= self.skip)
    p3, = par.plot(self.dat.timebase2, self.dat.Temp2, 'g,', 
                   label="Temp 2", markevery= self.skip)
    p4, = par.plot(self.dat.timebase2, self.dat.Temp3, 'm,', 
                   label="Temp 3", markevery= self.skip)
    host.axis["left"].label.set_color(p1.get_color())
    # …
Run Code Online (Sandbox Code Playgroud)

python memory backend matplotlib

39
推荐指数
1
解决办法
2559
查看次数

Matplotlib:将字符串添加为自定义x-ticks,还保留现有(数字)刻度标签?matplotlib.pyplot.annotate的替代品?

我试图生成一个图表,我有一些问题注释它.

我的图表在x轴上有一个对数刻度,显示时间.我希望能够做的是将现有(但不可预测)的数字刻度标签保持在100个单位,1000个单位,10000个单位等,还要在x轴上添加自定义刻度标签,以便更清楚"人类"可读的"时间间隔发生 - 例如我希望能够标记'一周','一个月','六个月'等.

我可以使用matplotlib.pyplot.annotate()来标记点,但它并没有真正做我想要的.我真的不想在图表上方放置文字和箭头,我只想添加一些额外的自定义刻度标记.有任何想法吗?

python annotate matplotlib axis-labels

18
推荐指数
3
解决办法
3万
查看次数

Python - 创建多个对象的巧妙方法?

我对Python很新,我有一个关于创建具有不同属性的多个对象的简洁方法的问题.目前我必须像这样专门创建每一个:

object1 = MyClass(property=foo,property2=bar)
object1.DoStuff(variable = foobar)

object2 = MyClass(property=foo,property2=bar2)
object2.DoStuff(variable = foobar)

object3 = MyClass(property=foo,property2=bar3)
object3.DoStuff(variable = foobar)
Run Code Online (Sandbox Code Playgroud)

我的问题是,我想以这种方式创建几十个对象,并且必须手动创建每个对象,这似乎是非常糟糕的编程.有没有更好的方法来创建具有略微不同属性的多个对象?

我想我想做的是:

list = [prop1, prop2, prop3, prop4, prop5]
while i < len(list)
    object_i = MyClass(property=foo,property2=list[i])
    object_i.DoStuff(variable = foobar)
    i+=1
Run Code Online (Sandbox Code Playgroud)

并创建了5个名为object_1,object_2等的对象

这可能吗?

python oop object

5
推荐指数
2
解决办法
1万
查看次数

总结python中的列表 - 有更好的方法吗?

有更明智的方法吗?我想通过总结许多其他列表的索引来创建一个新列表.我对编程很新,这看起来像一个非常笨重的方法!

list1 = [1,2,3,4,5]
list2 = [1,1,1,4,1]
list3 = [1,22,3,1,5]
list4 = [1,2,5,4,5]
...
list100 = [4,5,6,7,8]

i = 0
while i < len(list1):
    mynewlist[i] = list1[i]+list2[i]+list3[i]+list4[i]+...list100[i]
    i = i+1
Run Code Online (Sandbox Code Playgroud)

python sum list

5
推荐指数
2
解决办法
787
查看次数

在Matlab中更有效地循环矩阵元素

我正在写一些matlab代码并编写了一个有效的算法,但我认为它不是特别有效.由于我正在努力提高我的编程技巧,我想知道是否有更有效的方法来做到这一点.

我有一个(相当大的~E07)值矩阵,它们是无序的,但是在[-100,100]范围内.我想通过使用以下规则创建基于第一个矩阵的第二个矩阵:

  1. 如果该点的值> 70,则该点的值应设置为70.
  2. 如果该点的值小于-70,则该点的值应设置为-70.
  3. 所有其他值应四舍五入到最接近的5的倍数.

这是我目前正在做的事情:

data = 100*(-1+2*rand(1,10000000)); % create random dataset for stackoverflow
new_data = zeros(1,length(data));

for i = 1:length(data)
    if (data(i) > 70)
        new_data(i) = 70;
    elseif (data(i) < -70)
        new_data(i) = -70;
    else
        new_data(i) = round(data(i)/5.0)*5.0;
    end
end
Run Code Online (Sandbox Code Playgroud)

有更有效的方法吗?我认为应该有一种方法可以使用逻辑索引来做到这一点,但这些对我来说是一个新的发现......

matlab loops matrix

3
推荐指数
2
解决办法
1735
查看次数

在循环中使用Else语句会导致性能下降吗?

我正在用c#编写蒙特卡罗模拟,我正在努力确保编写尽可能高效的代码 - 我正在运行数十亿个循环,而且事情变得越来越慢.我有一个关于Else在循环中使用语句的问题.

我的问题是:这两种方法的性能有什么不同吗?在第一个我使用If-Else语句,在第二个我省略了Else,因为If案例非常罕见.

编辑:假设我需要做的不仅仅是在满足条件时分配true/false,因此直接赋值不是唯一需要完成的事情.if-Else方式的执行速度是否同样快?

       //METHOD 1
 ...       
            for (int index = 0; index < 6; index++)
            {
                for (int x = 0; x < 50; x++)
                {
                    for (int y = 0; y < 50; y++)
                    {


                        bool ThingWhichIsVeryRarelyTrue = SomeFunction(index,x,y);
                        if (ThingWhichIsVeryRarelyTrue)
                        {
                            BooleanAnswerArray[index][x][y] = true;
                            DoSomeOtherStuff();
                        }
                        else
                        {
                            BooleanAnswerArray[index][x][y] = false;
                        }
                    }
                }
            }
    ...
    //METHOD 2
    for (int index = 0; index < 6; index++)
            {
                for (int x = 0; x …
Run Code Online (Sandbox Code Playgroud)

c# performance loops if-statement

0
推荐指数
1
解决办法
417
查看次数