小编lnm*_*rer的帖子

在保持分辨率的同时保存类似imshow的图像

我有一个(n,m)数组,我一直在想象matplotlib.pyplot.imshow.我想将这些数据保存在某种类型的光栅图形文件中(例如png),以便:

  1. 颜色是显示的颜色 imshow
  2. 底层数组的每个元素恰好是保存图像中的一个像素 - 这意味着如果底层数组是(n,m)个元素,则图像是NxM像素.(我不是有意interpolation='nearest'imshow).
  3. 除了与阵列中的数据对应的像素之外,保存的图像中没有任何内容.(即边缘,轴等周围没有空白区域)

我怎样才能做到这一点?

我已经看到一些代码可以做到这一点,通过使用interpolation='nearest'和强制matplotlib(勉强)关闭轴,空格等.但是,必须有一些方法来更直接地做到这一点 - 也许与PIL?毕竟,我有基础数据.如果我可以为底层数组的每个元素获取RGB值,那么我可以使用PIL保存它.有没有办法从中提取RGB数据imshow?我可以编写自己的代码来将数组值映射到RGB值,但我不想重新发明轮子,因为matplotlib中已经存在该功能.

numpy matplotlib python-imaging-library pillow

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

用git选择性地合并文件的*部分*?

我希望有选择地合并文件的部分与git.

我有两个分支 - 称他们为主人并且改变了 - 这是一个分开的承诺; 如果我将master合并为change,它就会快进.

但是,我只想在一个文件中包含许多部分 - 从更改为主文件.

有没有一个干净的方法来做到这一点 - 例如在进行每次更改之前git询问?还是我坚持用手工做?(不是世界末日,但我不愿意,而且 - 是的 - 这可以通过我更多的计划来避免 - 这就是生活.)

git git-merge

19
推荐指数
1
解决办法
2357
查看次数

使用SciPy在矩形网格上集成2D样本

SciPy有三种方法可以对样本(trapz,simps和romb)进行一维积分,一种方法可以在函数上进行二维积分(dblquad),但它似乎没有方法在样本上进行二维积分 - - 甚至是矩形网格上的那些.

我看到的最接近的是scipy.interpolate.RectBivariateSpline.integral - 你可以从矩形网格上的数据创建一个RectBivariateSpline然后集成它.然而,这并不是非常快.

我想要比矩形方法更精确的东西(即只是总结一下).我可以说,使用2D Simpson规则,通过制作具有正确权重的数组,将其乘以我想要整合的数组,然后总结结果.

但是,如果已经有更好的东西,我不想重新发明轮子.在那儿?

python numpy scipy

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

如何使用数组(或任何支持添加的其他任何东西,以便它可以偏移)干净地索引numpy数组

解释我的问题最简单的方法可能是一个例子,所以让我定义一些数组:

>>> 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)

而不是我想要的: …

python indexing numpy offset

11
推荐指数
1
解决办法
7967
查看次数

快速总结numpy数组元素

假设我想做一个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)

python optimization numpy

11
推荐指数
1
解决办法
8268
查看次数

如何使用Python/Tkinter进行菜单栏切割/复制/粘贴

我想制作菜单项(在菜单栏中,而不是在右键单击弹出窗口中),可以剪切/复制/粘贴所选的任何文本.

等效的键盘命令已经工作,没有我做任何事情来启用它们.例如,我可以在输入框中输入文本,使用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/c08c10a7fbc4a637c1e08358fb9a859​​3dfdf116e

不过,可能还有一种更清洁的方法可以做到这一点; 如果你知道的话请回复.

python tkinter

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

在Ubuntu上编译Fortran netCDF程序

好的,这里有新问题.

我正在尝试编译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应该在那里: …

fortran netcdf

6
推荐指数
2
解决办法
6878
查看次数

使用 SciPy 求多维标量函数根的最佳方法

假设我有一个函数,其范围是标量,但其域是向量。例如:

def func(x):
  return x[0] + 1 + x[1]**2
Run Code Online (Sandbox Code Playgroud)

找到这个函数的根 好方法是什么?scipy.optimize.fsolvescipy.optimize.root期望func返回一个向量(而不是标量),并且scipy.optimize.newton只接受标量参数。我可以重新定义func

def func(x):
  return [x[0] + 1 + x[1]**2, 0]
Run Code Online (Sandbox Code Playgroud)

然后rootfsolve可以找到根,但是雅可比行列式中的零意味着它并不总是能很好地完成工作。例如:

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)

所以它现在愿意改变这两个参数。但代码仍然有点难看。

python scipy

6
推荐指数
1
解决办法
8868
查看次数

在python中实现基于FFT的基于FFT的核密度估计器,并将其与SciPy实现进行比较

我需要代码来做二维核密度估计(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)

python numpy fft scipy kernel-density

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

在总结两个数组的乘积时,gfortran或ifort编译器会明智地使用SIMD指令吗?

我有一些用numpy编写的代码,我正在考虑将它移植到Fortran以获得更好的性能.

我做过几次的一个操作就是将两个数组的元素乘积相加:

sum(A*B)
Run Code Online (Sandbox Code Playgroud)

看起来融合的乘法 - 加法指令会对此有所帮助.我当前的处理器不支持这些说明,所以我还无法测试.但是,我可能会升级到支持FMA3(Intel Haswell处理器)的新处理器.

有没有人知道用"-march = native"(或ifort等价物)编译程序是否足以让编译器(gfortran或ifort)明智地使用SIMD指令来优化代码,或者你认为我会必须要编译器或代码?

fortran simd gfortran fma intel-fortran

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