我有一个(n,m)数组,我一直在想象matplotlib.pyplot.imshow.我想将这些数据保存在某种类型的光栅图形文件中(例如png),以便:
imshowinterpolation='nearest'的imshow).我怎样才能做到这一点?
我已经看到一些代码可以做到这一点,通过使用interpolation='nearest'和强制matplotlib(勉强)关闭轴,空格等.但是,必须有一些方法来更直接地做到这一点 - 也许与PIL?毕竟,我有基础数据.如果我可以为底层数组的每个元素获取RGB值,那么我可以使用PIL保存它.有没有办法从中提取RGB数据imshow?我可以编写自己的代码来将数组值映射到RGB值,但我不想重新发明轮子,因为matplotlib中已经存在该功能.
我希望有选择地合并文件的部分与git.
我有两个分支 - 称他们为主人并且改变了 - 这是一个分开的承诺; 如果我将master合并为change,它就会快进.
但是,我只想在一个文件中包含许多部分 - 从更改为主文件.
有没有一个干净的方法来做到这一点 - 例如在进行每次更改之前git询问?还是我坚持用手工做?(不是世界末日,但我不愿意,而且 - 是的 - 这可以通过我更多的计划来避免 - 这就是生活.)
SciPy有三种方法可以对样本(trapz,simps和romb)进行一维积分,一种方法可以在函数上进行二维积分(dblquad),但它似乎没有方法在样本上进行二维积分 - - 甚至是矩形网格上的那些.
我看到的最接近的是scipy.interpolate.RectBivariateSpline.integral - 你可以从矩形网格上的数据创建一个RectBivariateSpline然后集成它.然而,这并不是非常快.
我想要比矩形方法更精确的东西(即只是总结一下).我可以说,使用2D Simpson规则,通过制作具有正确权重的数组,将其乘以我想要整合的数组,然后总结结果.
但是,如果已经有更好的东西,我不想重新发明轮子.在那儿?
解释我的问题最简单的方法可能是一个例子,所以让我定义一些数组:
>>> test = arange(25).reshape((5,5))
>>> test
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
>>> Xinds = array([1,2,3])
>>> Yinds = array([1,2,3])
Run Code Online (Sandbox Code Playgroud)
现在,如果我想要第1行,第2行和第3行以及第0列中的元素,我可以去:
>>> test[Yinds,0]
array([ 5, 10, 15])
Run Code Online (Sandbox Code Playgroud)
如果我想要第1,2和3行以及所有列中的项目,我可以去:
>>> test[Yinds, :]
array([[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试扩展它以获取第1,2和3行以及第1,2和3列中的元素,那就太惊讶了! - 我改为(1,1),(2,2)和(3,3)中的元素
>>> test[Yinds, Xinds]
array([ 6, 12, 18])
Run Code Online (Sandbox Code Playgroud)
而不是我想要的: …
假设我想做一个numpy数组列表的元素总和:
tosum = [rand(100,100) for n in range(10)]
Run Code Online (Sandbox Code Playgroud)
我一直在寻找最好的方法来做到这一点.好像numpy.sum很可怕:
timeit.timeit('sum(array(tosum), axis=0)',
setup='from numpy import sum; from __main__ import tosum, array',
number=10000)
75.02289700508118
timeit.timeit('sum(tosum, axis=0)',
setup='from numpy import sum; from __main__ import tosum',
number=10000)
78.99106407165527
Run Code Online (Sandbox Code Playgroud)
减少速度要快得多(接近两个数量级):
timeit.timeit('reduce(add,tosum)',
setup='from numpy import add; from __main__ import tosum',
number=10000)
1.131795883178711
Run Code Online (Sandbox Code Playgroud)
它看起来像甚至在非numpy总和上有一个有意义的领先(请注意,这些是针对1e6运行而不是1e4以上的时间):
timeit.timeit('reduce(add,tosum)',
setup='from numpy import add; from __main__ import tosum',
number=1000000)
109.98814797401428
timeit.timeit('sum(tosum)',
setup='from __main__ import tosum',
number=1000000)
125.52461504936218
Run Code Online (Sandbox Code Playgroud)
还有其他方法我应该尝试吗?任何人都可以解释排名吗?
编辑
如果列表首先变成numpy数组,numpy.sum肯定会更快:
tosum2 = array(tosum)
timeit.timeit('sum(tosum2, axis=0)',
setup='from numpy import sum; from __main__ import …Run Code Online (Sandbox Code Playgroud) 我想制作菜单项(在菜单栏中,而不是在右键单击弹出窗口中),可以剪切/复制/粘贴所选的任何文本.
等效的键盘命令已经工作,没有我做任何事情来启用它们.例如,我可以在输入框中输入文本,使用Control-X将其剪切,然后使用Control-C将其粘贴回(或其他地方).
关于我看到的主题的帖子归结为剪切/复制/粘贴各个小部件,但这已经有效.如何让菜单项激活它们?
谢谢.
编辑:只是要明确,问题是:
同样,执行此操作的关键命令(Control-x,Control-c,Control-v)已经可以在我没有做任何事情的情况下工作.我知道如何制作菜单 ; 问题是我应该将哪些命令附加到菜单项以获得所需的效果.
编辑2:好的,我有办法.由于关键命令已经起作用,我们可以生成它们.在我的情况下,一切都是一个名为noteBook的笔记本
lambda: self.noteBook.event_generate('<Control-x>')
根据需要削减.例如:
editmenu.add_command(label="Cut", accelerator="Ctrl+X", command=lambda: self.noteBook.event_generate('<Control-x>'))
使用中:https://github.com/lnmaurer/qubit-control-interface/commit/c08c10a7fbc4a637c1e08358fb9a8593dfdf116e
不过,可能还有一种更清洁的方法可以做到这一点; 如果你知道的话请回复.
好的,这里有新问题.
我正在尝试编译simple_xy_wr.f90 - 一个netCDF示例程序 - 在Ubuntu上使用gfortran,我必须做一些非常愚蠢的事情; 我没有太多编译Fortran的经验.
首先,我安装了libnetcdf-dev软件包,其中包含类似的文件
/usr/lib/libnetcdf.a
/usr/lib/libnetcdff.a
/usr/include/netcdf.mod
Run Code Online (Sandbox Code Playgroud)
所以,我试图用(各种命令)编译代码
f95 -o xy -I/usr/include/ -L/usr/lib/ -lnetcdff -lnetcdf simple_xy_wr.f90
Run Code Online (Sandbox Code Playgroud)
我得到以下输出
/tmp/ccE6g7sr.o: In function `check.1847':
simple_xy_wr.f90:(.text+0x72): undefined reference to `__netcdf_MOD_nf90_strerror'
/tmp/ccE6g7sr.o: In function `MAIN__':
simple_xy_wr.f90:(.text+0x284): undefined reference to `__netcdf_MOD_nf90_create'
simple_xy_wr.f90:(.text+0x2b6): undefined reference to `__netcdf_MOD_nf90_def_dim'
simple_xy_wr.f90:(.text+0x2e8): undefined reference to `__netcdf_MOD_nf90_def_dim'
simple_xy_wr.f90:(.text+0x432): undefined reference to `__netcdf_MOD_nf90_def_var_manydims'
simple_xy_wr.f90:(.text+0x468): undefined reference to `__netcdf_MOD_nf90_enddef'
simple_xy_wr.f90:(.text+0x4aa): undefined reference to `__netcdf_MOD_nf90_put_var_2d_fourbyteint'
simple_xy_wr.f90:(.text+0x4cb): undefined reference to `__netcdf_MOD_nf90_close'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我认为我包括了正确的库.例如,似乎__netcdf_MOD_nf90_strerror应该在那里: …
假设我有一个函数,其范围是标量,但其域是向量。例如:
def func(x):
return x[0] + 1 + x[1]**2
Run Code Online (Sandbox Code Playgroud)
找到这个函数的根 的好方法是什么?scipy.optimize.fsolve并scipy.optimize.root期望func返回一个向量(而不是标量),并且scipy.optimize.newton只接受标量参数。我可以重新定义func为
def func(x):
return [x[0] + 1 + x[1]**2, 0]
Run Code Online (Sandbox Code Playgroud)
然后root和fsolve可以找到根,但是雅可比行列式中的零意味着它并不总是能很好地完成工作。例如:
fsolve(func, array([0,2]))
=> array([-5, 2])
Run Code Online (Sandbox Code Playgroud)
它只会改变第一个参数,但不会改变第二个参数,这意味着它经常会找到很远的零。
编辑:看起来下面的 func 重新定义效果更好:
def func(x):
fx = x[0] + 1 + x[1]**2
return [fx, fx]
fsolve(func, array([0,5]))
=>array([-16.27342781, 3.90812331])
Run Code Online (Sandbox Code Playgroud)
所以它现在愿意改变这两个参数。但代码仍然有点难看。
我需要代码来做二维核密度估计(KDE),我发现SciPy实现太慢了.所以,我已经编写了一个基于FFT的实现,但有些事情让我很困惑.(FFT实现还强制执行周期性边界条件,这就是我想要的.)
该实现基于从样本创建简单的直方图,然后使用高斯进行卷积.这是执行此操作的代码,并将其与SciPy结果进行比较.
from numpy import *
from scipy.stats import *
from numpy.fft import *
from matplotlib.pyplot import *
from time import clock
ion()
#PARAMETERS
N = 512 #number of histogram bins; want 2^n for maximum FFT speed?
nSamp = 1000 #number of samples if using the ranom variable
h = 0.1 #width of gaussian
wh = 1.0 #width and height of square domain
#VARIABLES FROM PARAMETERS
rv = uniform(loc=-wh,scale=2*wh) #random variable that can generate samples
xyBnds = linspace(-1.0, 1.0, N+1) …Run Code Online (Sandbox Code Playgroud) 我有一些用numpy编写的代码,我正在考虑将它移植到Fortran以获得更好的性能.
我做过几次的一个操作就是将两个数组的元素乘积相加:
sum(A*B)
Run Code Online (Sandbox Code Playgroud)
看起来融合的乘法 - 加法指令会对此有所帮助.我当前的处理器不支持这些说明,所以我还无法测试.但是,我可能会升级到支持FMA3(Intel Haswell处理器)的新处理器.
有没有人知道用"-march = native"(或ifort等价物)编译程序是否足以让编译器(gfortran或ifort)明智地使用SIMD指令来优化代码,或者你认为我会必须要编译器或代码?