编辑:如果我明确地将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) 我试图生成一个图表,我有一些问题注释它.
我的图表在x轴上有一个对数刻度,显示时间.我希望能够做的是将现有(但不可预测)的数字刻度标签保持在100个单位,1000个单位,10000个单位等,还要在x轴上添加自定义刻度标签,以便更清楚"人类"可读的"时间间隔发生 - 例如我希望能够标记'一周','一个月','六个月'等.
我可以使用matplotlib.pyplot.annotate()来标记点,但它并没有真正做我想要的.我真的不想在图表上方放置文字和箭头,我只想添加一些额外的自定义刻度标记.有任何想法吗?
我对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等的对象
这可能吗?
有更明智的方法吗?我想通过总结许多其他列表的索引来创建一个新列表.我对编程很新,这看起来像一个非常笨重的方法!
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) 我正在写一些matlab代码并编写了一个有效的算法,但我认为它不是特别有效.由于我正在努力提高我的编程技巧,我想知道是否有更有效的方法来做到这一点.
我有一个(相当大的~E07)值矩阵,它们是无序的,但是在[-100,100]范围内.我想通过使用以下规则创建基于第一个矩阵的第二个矩阵:
这是我目前正在做的事情:
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)
有更有效的方法吗?我认为应该有一种方法可以使用逻辑索引来做到这一点,但这些对我来说是一个新的发现......
我正在用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) python ×4
loops ×2
matplotlib ×2
annotate ×1
axis-labels ×1
backend ×1
c# ×1
if-statement ×1
list ×1
matlab ×1
matrix ×1
memory ×1
object ×1
oop ×1
performance ×1
sum ×1