对于研究相关的Python程序,我需要Python 2.6(或2.7),numpy,scipy和matplotlib.偶尔,我将使用其他模块,如mayavi2或numexpr.
问题中的程序将在(Ubuntu)Linux和Windows之间交换,并且可以修改为跨平台工作.Windows端的设置应尽可能与Linux设置类似.不需要与COM,.NET或Windows操作系统集成.
我知道以下选项:
哪一个能为我提供最有效的设置?它们会有什么不同?
我想数值计算numpy数组Y上的FFT.为了测试,我使用高斯函数Y = exp(-x ^ 2).(符号)傅立叶变换是Y'=常数*exp(-k ^ 2/4).
import numpy
X = numpy.arange(-100,100)
Y = numpy.exp(-(X/5.0)**2)
Run Code Online (Sandbox Code Playgroud)
天真的方法失败了:
from numpy.fft import *
from matplotlib import pyplot
def plotReIm(x,y):
f = pyplot.figure()
ax = f.add_subplot(111)
ax.plot(x, numpy.real(y), 'b', label='R()')
ax.plot(x, numpy.imag(y), 'r:', label='I()')
ax.plot(x, numpy.abs(y), 'k--', label='abs()')
ax.legend()
Y_k = fftshift(fft(Y))
k = fftshift(fftfreq(len(Y)))
plotReIm(k,Y_k)
Run Code Online (Sandbox Code Playgroud)
实数(Y_k)在正值和负值之间跳跃,这对应于跳跃阶段,这在符号结果中不存在.这当然是不可取的.(结果在技术上是正确的,因为abs(Y_k)给出了预期ifft(Y_k)为Y的幅度.)
这里,函数fftshift()使数组k单调递增并相应地改变Y_k.通过对两个向量应用此操作,不会更改对zip(k,Y_k).
此更改似乎可以解决此问题:
Y_k = fftshift(fft(ifftshift(Y)))
k = fftshift(fftfreq(len(Y)))
plotReIm(k,Y_k)
Run Code Online (Sandbox Code Playgroud)
如果需要单调Y和Y_k,这是使用fft()函数的正确方法吗?
以上的反向操作是:
Yx = fftshift(ifft(ifftshift(Y_k)))
x = fftshift(fftfreq(len(Y_k), k[1] - k[0]))
plotReIm(x,Yx)
Run Code Online (Sandbox Code Playgroud)
对于这种情况,文档清楚地指出Y_k必须与fft()和fftfreq()的输出进行排序,我们可以通过应用ifftshift()来实现.
那些问题一直困扰着我很长时间:fft()和ifft()的输出和输入数组是否总是如此a[0] should …
FFT 库(例如 FFTW 或 numpy.fft)通常提供两个函数fft()和ifft()(及其用于实值输入的特殊版本)。这些函数的定义似乎是这样的
ifft(fft(X)) == X
Run Code Online (Sandbox Code Playgroud)
和
fft(X) == constant_factor * reverse(ifft(X))
Run Code Online (Sandbox Code Playgroud)
在复杂输入之间进行选择ifft()和操作时,是否有任何实际或技术原因需要考虑?虽然(信号、时域或空间域)和(频谱、频域)fft()的解释不同,但它在计算上重要吗?Xfft(X)
我想创建一个伪彩色图(例如contour或contourf)和一个颜色条。出于实际原因,我希望颜色条的范围与底层可映射不同。
在下面的示例中,数据 Z 的范围从 0 到 10000,映射到颜色图。颜色条的范围是相同的。
import numpy
from matplotlib import pyplot
X = numpy.arange(100)
Y = numpy.arange(100)
Z = numpy.arange(100**2).reshape((100,100))
f = pyplot.figure()
ax = f.gca()
cf = ax.contourf(X,Y,Z,100)
cbar = f.colorbar(cf, ticks=[3000,4000,5000,6000])
pyplot.show()
Run Code Online (Sandbox Code Playgroud)

现在,我想“放大”颜色条,即生成一个范围从 3000 到 6000 的颜色条。这个新的颜色条仍将作为图例并为每个刻度提供适当的颜色(3000 = 蓝色,6000 = 黄色)。既不实现cbar.set_clim()也不cf.set_clim()实现这一点。
在命令行上,我得到这个:
$ FOO=foo
$ echo $FOO
foo
$ echo $$FOO
11971FOO
Run Code Online (Sandbox Code Playgroud)
这里,$$按预期解析为shell的PID,并逐字打印"FOO".
现在,尝试理解和调试一些脚本,我发现以下内容:
#!/bin/bash
FILE1=/path/to/file/1
FILE2=/path/to/file/2
echo $$FILE1 >> $$FILE2
Run Code Online (Sandbox Code Playgroud)
有问题的脚本源自Debian软件包的安装后脚本.这应该在它运行之前进行预处理吗?
更新:该脚本是使用epm构建的包的一部分,并通过以下指令读取:
%postinstall <script.sh
Run Code Online (Sandbox Code Playgroud)
在生成的deb包中,postinst脚本显示:
#!/bin/bash
FILE1=/path/to/file/1
FILE2=/path/to/file/2
echo $FILE1 >> $FILE2
Run Code Online (Sandbox Code Playgroud)
因此,处理由epm或dpkg完成.
Presto 有多个连接器。虽然连接器确实实现了读写操作,但从我读过的所有教程来看,它们似乎通常用作仅读取的数据源。例如,netflix在 Amazon S3 上有“10 PB”的数据,并且明确声明 Presto 工作节点上没有使用任何磁盘(也没有 HDFS)。所述用例是“临时交互式”查询。
此外,Amazon Athena 本质上是 S3+Presto,并且具有类似的用例。
我很困惑这如何在实践中发挥作用。显然,您不想每次查询都读取 10 PB 的数据。所以我假设,您希望将一些以前获取的数据保留在内存中,例如数据库索引。然而,由于对数据和查询没有限制,我无法理解这是如何高效的。
用例 1:我经常运行相同的查询,例如在仪表板上显示指标。Presto 是否避免重新扫描已经“已知”的数据点?
用例 2:我正在分析一个大型数据集。每个查询都略有不同,但是存在公共子查询,或者我们过滤到数据的公共子集。Presto 是否从之前的查询中学习并保留中间结果?
或者,如果情况并非如此,是否建议我将中间结果存储在某处(例如 CREATE TABLE AS ...)?
当我尝试sqlite3在EFS目录上创建基础时,这会导致错误:
$ sqlite3 foo.db
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .log stderr
sqlite> CREATE TABLE foo (int bar);
Error: disk I/O error
有问题的Sqlite3数据库应仅用于故事元数据,并且不经常更新.不需要并发访问.但是,如果创建数据库的进程终止,则需要在不同的主机上重新启动该进程,并继续执行先前实例退出的位置.
亚马逊声称EFS是一个"文件系统,可以通过文件系统接口(使用标准操作系统文件I/O API)访问Amazon EC2实例,并且支持完整文件系统访问语义(例如强一致性和文件锁定) )".因此,我认为它适合手头的任务.
挂载选项/etc/fstab包括:
eu-west-1a.fs-ID.efs.eu-west-1.amazonaws.com://efs nfs4 nfsvers = 4.1,rsize = 1048576,wsize = 1048576,hard,timeo = 600,retrans = 2 0 0
据我所知,通常不鼓励将数据库放在NFS上.但是,我相信,鉴于亚马逊和SQLite使用的语言,开发人员将继续尝试.