Jython数组的数学运算

时间:2014-08-20 07:59:43

标签: arrays jython

我试图以下列方式对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中修改数组的任何提示。谢谢!!!

2 个答案:

答案 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秒。