我对API感到困惑scipy.ndimage.interpolation.affine_transform.从这个问题来看,我不是唯一一个.我实际上想要做更多有趣的事情,affine_transform而不仅仅是旋转图像,但旋转会为初学者做.(是的,我很清楚scipy.ndimage.interpolation.rotate,但弄清楚如何驾驶affine_transform是我感兴趣的).
当我想在像OpenGL这样的系统中做这种事情的时候,我想在计算变换时会考虑一个2x2旋转矩阵R围绕一个中心c,因此想到p要被转换的点(p-c)R+c= pR+c-cR,这给出了一个c-cR术语来使用作为转换的翻译组件. 然而,根据上面的问题,scipy's affine_transform确实" 先偏移 ",所以我们实际上需要计算一个偏移量s,(p-c)R+c=(p+s)R以便通过一些重新排列给出s=(c-cR)R'其中R'的倒数R.
如果我把它插入ipython笔记本(pylab模式;下面的代码可能需要一些额外的导入):
img=scipy.misc.lena()
#imshow(img,cmap=cm.gray);show()
centre=0.5*array(img.shape)
a=15.0*pi/180.0
rot=array([[cos(a),sin(a)],[-sin(a),cos(a)]])
offset=(centre-centre.dot(rot)).dot(linalg.inv(rot))
rotimg=scipy.ndimage.interpolation.affine_transform(
img,rot,order=2,offset=offset,cval=0.0,output=float32
)
imshow(rotimg,cmap=cm.gray);show()
Run Code Online (Sandbox Code Playgroud)
我明白了

不幸的是,它没有围绕中心旋转.
那么我在这里缺少什么诀窍?
我正在研究用ant + cpptasks构建的大型C++系统.它运行良好,但build.xml文件失控,因为添加新库或可执行目标的标准操作过程是复制并粘贴另一个lib/exe的规则(已经非常大).如果这是"正确的代码",它会为重构而尖叫,但作为一个蚂蚁新手(更习惯制作或VisualStudio解决方案)我不确定选项是什么.
什么是蚂蚁用户阻止ant构建文件爆炸的最佳做法?
一个显而易见的选择是通过XSLT生成build.xml,为常见的重复模式定义自己的标记.有人这样做,还是有更好的方法?
我正在将一些Qt(C++和QML)代码从Qt4.8升级到Qt5.1.
Qt4.8代码是一个简单的C++"QML查看器"应用程序子类化a QDeclarativeView和一堆QML.
QQuickView除了一件事之外,很容易将其更改为使用Qt5/QtQuick2 :
Qt4.8应用程序有一个打印到PDF的方法:
void MyQMLViewer::printToPDF(const QString& filename) const {
QPrinter printer(QPrinter::HighResolution);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setPageSize(QPrinter::A3);
printer.setOutputFileName(filename);
printer.setOrientation(QPrinter::Landscape);
QPainter painter(&printer);
render(&painter);
}
Run Code Online (Sandbox Code Playgroud)
Qt5.1需要进行一些"环境"更改才能获得QPrinter(即添加QT += printsupport到项目.pro文件中#include <QtPrintSupport>),但似乎有一个更基本的问题,QQuickView它不提供任何明显与QGraphicsView/ 兼容的东西.QPainter/ QPaintDeviceworld of QPrinter(具体来说,QQuickView没有render方法,所有绘图/绘画/渲染相关的方法看起来与OpenGL非常相关).
有关如何从中获得高质量PDF输出的任何建议QQuickView?
(请注意,我not只是希望截图的视图;与QDeclarativeView上面的代码生成的PDF文件与很多更好的分辨率甚至超过了应用程序全屏我最大的显示器上).
我看到"将QML应用程序移植到Qt 5"指南中的"QDeclarativeItem和QDeclarativeView"部分确实提到了QGraphicsView特定功能的丢失,但没有提供任何解决方案(尽管它确实提到了带有自定义项目的工作场所QPainter-基础渲染被买入新政权).
更新一些额外的背景信息:可以在此处找到使用上述代码从QDeclarativeView打印的PDF示例.有一个体面的大小监视器上相同的观点的PNG 这里.(这实际上是一系列幻灯片中的最后一张幻灯片;它实际上是以前幻灯片的一个画廊,它将每张幻灯片反弹到屏幕上;如果我有时间,我会考虑画廊的可行性是唯一的改变每个分散的幻灯片进入Prezi风格的演示视图;怀疑QDeclarative虽然不够真实,这是想要进入QtQuick2 + Qt5.2的新场景图形的一个原因).无论如何,如果你将PDF缩放到100%,你会看到文本是...好吧,它比任何一个大小合适的图像文件管理我认为,尽管倾斜的文本基线可能看起来有点不均匀.还有一个问题,不透明度值没有在PDF中表示(因此阴影和"气泡"变得坚固); …
在过去,我已经将RGB图像(从物理模拟生成)保存为8位/通道PPM或PNG或JPEG.
现在我想保留模拟输出的动态范围,这意味着保存浮点图像,然后将转换处理为8位/通道作为后处理步骤(因此我可以将转换调整为8位而不运行冗长的模拟再次).
是否出现了"标准"浮点图像格式?
良好的免费支持库/查看器/操作工具,最好在Debian中提供,将是一个奖励.
如果我date +%H-%M-%S在命令行(Debian/Lenny)上做的话,我会得到一个用户友好的(不是UTC,而不是DST-less,正常人在他们的手表上的时间)打印时间.
获得同样东西的最简单方法是boost::date_time什么?
如果我这样做:
std::ostringstream msg;
boost::local_time::local_date_time t =
boost::local_time::local_sec_clock::local_time(
boost::local_time::time_zone_ptr()
);
boost::local_time::local_time_facet* lf(
new boost::local_time::local_time_facet("%H-%M-%S")
);
msg.imbue(std::locale(msg.getloc(),lf));
msg << t;
Run Code Online (Sandbox Code Playgroud)
然后msg.str()比我想要的时间早一个小时.我不确定这是因为它显示UTC或本地时区没有DST校正时间(我在英国).
修改上述内容以获得DST更正的本地时区时间的最简单方法是什么?我知道它涉及boost::date_time:: c_local_adjustor但无法从示例中弄清楚.
因此scala 2.9最近出现在Debian测试中,带来了新奇的并行集合.
假设我有一些相当于的代码
def expensiveFunction(x:Int):Int = {...}
def process(s:List[Int]):List[Int} = s.map(expensiveFunction)
Run Code Online (Sandbox Code Playgroud)
现在,在我的机器上实际显示文档之前,我已经收集到了关于并行集合的那些内容,我希望通过将List切换到ParList... 来并行化这个...但令我惊讶的是,没有一个!(只是ParVector,ParMap,ParSet...).
作为一个工作区,这个(或一行等效)似乎运作良好:
def process(s:List[Int]):List[Int} = {
val ps=scala.collection.parallel.immutable.ParVector()++s
val pr=ps.map(expensiveFunction)
List()++pr
}
Run Code Online (Sandbox Code Playgroud)
在我的测试代码中实现了大约x3的性能提升,并实现了更高的CPU使用率(四核和超线程i7).但它似乎有点笨重.
我的问题是一种汇总的:
ParList?ParList,我应该采用哪种更好的模式/习语,以至于我不觉得他们错过了?Vectors?(我指的是C++的土地,我通常会需要一个很好的理由使用
std::list过std::vector).我最近参与了一个有iOS开发组织帐户的小组.
他们有多个团队都开发独立的iOS应用程序.我有点惊讶地发现,使用该组织的"iOS发行版"证书并没有协调.相反,无论开发人员需要提交构建版本只需创建一个新版本,必要时撤销一个或多个现有版本(Apple似乎允许其中三个的有限供应同时"生效").这种做法的理由似乎是以下观察的组合:
但是,我观察到这种快速分发证书流失政策的一个非常严重的负面后果是,testflight构建根本不会长时间保持有效,并且tesflight用户发现自己得到关于无效证书或应用程序的对话框他们应该是testflight测试员很快就从testflight中消失了.(事实上也看到这个问题沿着同样的路线).
鉴于Apple明确将testflight视为appstore基础架构的重要组成部分,我发现很难相信这个组织正在以苹果实际上打算完成任务的方式开展工作. 有人能够对正确的做事方式有所了解请赐教吗?
如果我的术语在上面的某些内容中没有了,我道歉...我只是涉足这个问题.
我们有配备XP64的Core2机器(Dell T5400).
我们观察到,当运行32位进程时,memcpy的性能大约为1.2GByte/s; 然而,64位进程中的memcpy达到大约2.2GByte/s(或英特尔编译器CRT的memcpy为2.4GByte/s).虽然最初的反应可能只是解释这个因为64位代码中可用的寄存器更宽,但我们观察到我们自己的类似memcpy的SSE汇编代码(应该使用128位宽的加载存储而不管32位/ 64位过程)表明它实现的复制带宽有类似的上限.
我的问题是,这个差异究竟是由于什么原因造成的?32位进程是否必须通过一些额外的WOW64箍来获取RAM?这与TLB或prefetchers有什么关系还是......什么?
感谢您的任何见解.
也在英特尔论坛上提出.
我正在使用mayavi(3.3.2)来显示音量等值面.
一般来说,我的卷没有立方体素; 例如,采样网格在X和Y方向上可能是1mm x 1mm,但在Z方向上可能是1.4mm.
如何使用mayavi mlab.contour3d或mlab.pipeline.iso_surface?使用正确的空间比例显示此类体积?我真的更愿意不将卷重新采样为立方网格.
说明问题的另一种方法:我可以做些什么来使下面的代码显示一个球体而不是一个扁平的elipsoid(将它volume与预期的1:1:2纵横比体素作为给定,并且不重新生成或重新采样体积).
import numpy as np
from enthought.mayavi import mlab
def sqr(x): return x*x
s=64
x,y,z = np.ogrid[0:s,0:s,0:s/2]
volume = np.sqrt(sqr(x-s/2)+sqr(y-s/2)+sqr(2*z-s/2))
isos = mlab.contour3d(volume,contours=[5,15,25],transparent=True)
mlab.show()
Run Code Online (Sandbox Code Playgroud)
我猜测应该有一些方法来获取底层的VTK图形管道(它的变换等)并插入适当的各向异性缩放(如果没有某种方式通过mlab API更直接地进行).
以下代码最能说明我的问题:
输出到控制台(NB甚至第一次测试需要大约8分钟)显示512x512x512x16位阵列分配消耗不超过预期(每个256MByte),并且查看"顶部"过程通常仍然是600MByte如预期.
但是,在调用函数的矢量化版本时,该过程会扩展到巨大的大小(超过7GByte!).即便是我能想到的最明显的解释 - 向量化将输入和输出转换为内部的float64 - 即使向量化函数返回一个int16,也只能占用几千兆字节,返回的数组肯定是一个int16.有没有办法避免这种情况发生?我使用/理解vectorize的otypes参数错了吗?
import numpy as np
import subprocess
def logmem():
subprocess.call('cat /proc/meminfo | grep MemFree',shell=True)
def fn(x):
return np.int16(x*x)
def test_plain(v):
print "Explicit looping:"
logmem()
r=np.zeros(v.shape,dtype=np.int16)
for z in xrange(v.shape[0]):
for y in xrange(v.shape[1]):
for x in xrange(v.shape[2]):
r[z,y,x]=fn(x)
print type(r[0,0,0])
logmem()
return r
vecfn=np.vectorize(fn,otypes=[np.int16])
def test_vectorize(v):
print "Vectorize:"
logmem()
r=vecfn(v)
print type(r[0,0,0])
logmem()
return r
logmem()
s=(512,512,512)
v=np.ones(s,dtype=np.int16)
logmem()
test_plain(v)
test_vectorize(v)
v=None
logmem()
Run Code Online (Sandbox Code Playgroud)
我正在使用amd64 Debian Squeeze系统(Python 2.6.6,numpy 1.4.1)中最新的Python/numpy版本.
c++ ×3
python ×3
memory ×2
numpy ×2
scipy ×2
32-bit ×1
64-bit ×1
ant ×1
app-store ×1
boost ×1
certificate ×1
cpu ×1
debian ×1
file-format ×1
graphics ×1
hdrimages ×1
ios ×1
list ×1
map ×1
matplotlib ×1
mayavi ×1
qt ×1
qt-quick ×1
qt5 ×1
qtquick2 ×1
rendering ×1
rotation ×1
scala ×1
testflight ×1
timezone ×1
volume ×1
windows ×1
xcode ×1