TL; DR:为什么乘法/转换数据的size_t速度很慢,为什么每个平台会有所不同?
我遇到了一些我不太了解的性能问题.上下文是相机帧抓取器,其中读取128x128 uint16_t图像并以几百Hz的速率进行后处理.
在后处理中,我生成一个直方图frame->histo,该直方图uint32_t具有thismaxval= 2 ^ 16个元素,基本上我统计了所有强度值.使用这个直方图,我计算总和和平方和:
double sum=0, sumsquared=0;
size_t thismaxval = 1 << 16;
for(size_t i = 0; i < thismaxval; i++) {
sum += (double)i * frame->histo[i];
sumsquared += (double)(i * i) * frame->histo[i];
}
Run Code Online (Sandbox Code Playgroud)
使用配置文件分析代码我得到以下(样本,百分比,代码):
58228 32.1263 : sum += (double)i * frame->histo[i];
116760 64.4204 : sumsquared += (double)(i * i) * frame->histo[i];
Run Code Online (Sandbox Code Playgroud)
或者,第一行占用CPU时间的32%,第二行占64%.
我做了一些基准测试,似乎是数据类型/转换有问题.当我将代码更改为
uint_fast64_t isum=0, isumsquared=0;
for(uint_fast32_t i = 0; i < thismaxval; i++) …Run Code Online (Sandbox Code Playgroud) 我正在将图像从.png转换为.eps,这极大地增加了文件大小.任何人都可以解释为什么会这样,以及如何防止它增加这么多.
我正在使用Unix 转换:convert image.png image.eps
谢谢你的帮助
我正在尝试绘制某些数据的子集,但在设置 x 轴限制后,y 轴限制未正确更新。有没有办法在设置 x 轴限制后让 matplotlib 更新 y 轴限制?
例如,考虑下图:
import numpy
import pylab
pylab.plot(numpy.arange(100)**2.0)
Run Code Online (Sandbox Code Playgroud)
这使: 
这工作正常。但是,如果我只想查看从 x=0 到 x=10 的部分,y 缩放就搞砸了:
pylab.plot(numpy.arange(100)**2.0)
pylab.xlim(0,10)
Run Code Online (Sandbox Code Playgroud)
这使:
.
在前一种情况下,x 轴和 y 轴已正确缩放,在后一种情况下,即使未绘制数据,y 轴仍然缩放相同。我如何告诉 matplotlib 更新 y 轴缩放?
明显的解决方法是绘制数据本身的子集,或者通过检查数据手动重置 y 轴限制,但这些都相当麻烦。
更新:
上面的例子是简化的,在更一般的情况下,有:
pylab.plot(xdata, ydata1)
pylab.plot(xdata, ydata2)
pylab.plot(xdata, ydata3)
pylab.xlim(xmin, xmax)
Run Code Online (Sandbox Code Playgroud)
手动设置 y 轴范围当然是可能的
subidx = N.argwhere((xdata >= xmin) & (xdata <= xmax))
ymin = N.min(ydata1[subidx], ydata2[subidx], ydata3[subidx])
ymax = N.max(ydata1[subidx], ydata2[subidx], ydata3[subidx])
pylab.xlim(xmin, xmax)
Run Code Online (Sandbox Code Playgroud)
但这至少可以说很麻烦(恕我直言)。有没有更快的方法来做到这一点而无需手动计算绘图范围?谢谢!
更新 2:
函数autoscale做了一些缩放,似乎是这项工作的合适人选,但独立处理轴并且只 …
有时候,我不得不在这里我想测试一个变量是否是一个情况0还是None与否.在纯Python中,这很简单
foo == True
Run Code Online (Sandbox Code Playgroud)
但是当foo可能是Numpy对象(例如numpy.ndarray)时,这不再起作用了,我得到错误:
ValueError: The truth value of an array with more than one element is ambiguous.
Use a.any() or a.all()
Run Code Online (Sandbox Code Playgroud)
在这种情况下我想要a.any(),但是这在非可迭代对象上失败了.
当然,我可以明确地检查,如果foo是0或None,但我想知道如果有一个更优雅的方式来做到这一点.
如何检查是否有任意对象(可迭代和不可迭代)True?
我将能源使用数据记录为计数器,我希望将其显示为每天重置的累积图表,正如此处提出的类似要求。
我可以按如下方式生成累积值:
SELECT mean("value") \
FROM "energy" \
WHERE $timeFilter \
GROUP BY time($__interval)
Run Code Online (Sandbox Code Playgroud)
以及每日价值:
SELECT max("value") \
FROM "energy" \
WHERE $timeFilter \
GROUP BY time(1d)
Run Code Online (Sandbox Code Playgroud)
但我无法减去它或在一个查询中得到它,因为 GROUP BY 时间不同。
(如何)这在 influxdb 中可能吗?我看过 INTEGRATE() 但这还没有找到一种方法来使其工作。
数据如下所示(示例仅限 1 天):
time value
---- ----
2018-12-10T17:00:00Z 7
2018-12-10T18:00:00Z 9
2018-12-10T19:00:00Z 10
2018-12-10T20:00:00Z 11
2018-12-10T21:00:00Z 13
2018-12-10T22:00:00Z 14
2018-12-10T23:00:00Z 15
2018-12-11T00:00:00Z 16
2018-12-11T01:00:00Z 17
2018-12-11T02:00:00Z 20
2018-12-11T03:00:00Z 24
2018-12-11T04:00:00Z 25
2018-12-11T05:00:00Z 26
2018-12-11T06:00:00Z 27
2018-12-11T07:00:00Z 28
2018-12-11T08:00:00Z 29
2018-12-11T09:00:00Z 31
2018-12-11T10:00:00Z …Run Code Online (Sandbox Code Playgroud) 我开始在我的Mac上运行从C代码(使用XCode 4.3)编译的MATLAB(R2012a)的MEX文件(运行OSX 10.7.3,Lion).我已经安装了MATLAB提供的XCode补丁,该补丁配置MATLAB以在XCode 4.2+下使用新的llvm-gcc编译器,但是我仍然在尝试使用以下命令编译示例文件时出现以下错误mex timestwo.c:
/Applications/MATLAB_R2012a.app/extern/include/matrix.h:852:20: error: stdlib.h: No such file or directory
In file included from timestwo.c:1:
/Applications/MATLAB_R2012a.app/extern/include/mex.h:161:19: error: stdio.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)
编译然后打破
mex: compile of ' "timestwo.c"' failed.
Error using mex (line 206)
Unable to complete successfully.
Run Code Online (Sandbox Code Playgroud)
显然,编译器找不到标准库头文件目录,但是需要更改才能成功编译?
所以我正在学习python,而我目前正在制作3D情节.为了让事情变得有趣,我想制作一个Klein Bottle的情节,但不知何故它根本不起作用.我尝试了表面的两个参数化(一个在Wolfram上,一个在一个随机网站上)都给出了一个圆环形状.
所以我想知道我的代码是否错了.任何人都可以看看并告诉我,如果我做得对(如果你碰巧知道Klein瓶的参数化,那么这也是受欢迎的:P)
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np
def surf(u, v):
X = (3+(1+np.sin(v)) + 2*(1 - np.cos(v)/2)*np.cos(u))*np.cos(v)
Y = (4+2*(1 - np.cos(v)/2) * np.cos(u))*np.sin(v)
Z = -2*(1-np.cos(v)/2)*np.sin(u)
return X,Y,Z
ux, vx = np.meshgrid(np.linspace(0, 2*np.pi, 20),
np.linspace(0, 2*np.pi, 20))
x,y,z = surf(ux, vx)
fig = plt.figure()
ax = fig.gca(projection="3d")
plot = ax.plot_surface(x,y,z, rstride=1, cstride=1, cmap=cm.jet,
linewidth=0, antialiased=False)
plt.show()
Run Code Online (Sandbox Code Playgroud)