我试图以下列方式对Jython数组的每个元素进行简单的数学运算:
import math
for i in xrange (x*y*z):
medfiltArray[i] = 2 * math.sqrt(medfiltArray[i] + (3.0/8.0) )
InputImgArray[i] = 2 * math.sqrt(InputImgArray[i] + (3.0/8.0) )
问题是我的数组很大(8388608个元素),这个过程需要12秒多一点。有没有更有效的方法来完成这整个过程?我找到了一种更快的方式(大约7秒):
medfiltArray = map(lambda x: 2 * math.sqrt(x + (3.0/8.0) ) , medfiltArray)
for循环优于此方法的优点是我可以同时修改几个相同大小的数组,从而节省净时间。但尽管如此,这仍然非常缓慢。在MATLAB中修改矩阵只需不到一秒钟:
img = 2 * sqrt(img + (3/8));
非常感谢有关在Jython中修改数组的任何提示。谢谢!!!
答案 0 :(得分:1)
Python附带电池,但没有好的矩阵电池。幸运的是NumPy解决了这个问题,但不幸的是,我从个人经验中不了解Jython的替代品,只有几个搜索显示:jnumeric(似乎过时了),http://acs.lbl.gov/ACSSoftware/colt/(过时了?),{{3}及其SO链接:http://mail.scipy.org/pipermail/numpy-discussion/2012-August/063751.html ..
在任何情况下,简单的CPython / NumpPy示例都可能如下所示:
import numpy as np
# dummy init values:
x = 800
y = 100
z = 100
length = x*y*z
medfiltArray = np.arange(length, dtype='f')
InputImgArray = np.arange(length, dtype='f')
# m is a constant, no reason to recalculate it 8million times
m = (3.0/8.0)
medfiltArray = 2 * np.sqrt(medfiltArray + m)
InputImgArray = 2 * np.sqrt(InputImgArray + m)
# timed, it runs in:
# real 0m0.161s
# user 0m0.131s
# sys 0m0.032s
祝你好运找到你的Jython替代品,我希望这能让你走上正确的道路。
答案 1 :(得分:1)
有一个名为Vectorz的快速矢量和矩阵java库。 Vectorz可以在Jython中导入,并在大约200毫秒内完成我的问题中描述的计算。用户必须从Jython中的python(或java)数组切换并使用Vectorz数组。还有另一个解决方案,如果你正在进行图像处理(像我一样),有一个名为ImageJ的程序,它具有广泛的功能。我正在使用ImageJ插件并进行这些数学运算,您还可以使用内部ImageJ数学命令:
IJ.run(InputImg, "32-bit", "");
IJ.run(InputImg, "Add...", "value=0.375 stack");
IJ.run(InputImg, "Square Root", "stack");
IJ.run(InputImg, "Multiply...", "value=2 stack");
这只需要0.1秒。