Jython:ImportError:没有名为multiarray的模块

时间:2011-08-05 12:32:00

标签: python numpy nlp jython nltk

当我尝试使用Jython调用文件及其方法时,它显示以下错误,而我的Numpy,Python和NLTK已正确安装,如果我直接从Python shell直接运行它可以正常运行

File "C:\Python26\Lib\site-packages\numpy\core\__init__.py", line 5, in <module>
import multiarray
ImportError: No module named multiarray

我使用的代码很简单:

PyInstance hello = ie.createClass("PreProcessing", "None");  
PyString str = new PyString("my name is abcd");
PyObject po = hello.invoke("preprocess", str);
System.out.println(po);

当我只运行包含类PreProcessing的python文件并调用方法预处理时,它工作正常,但是使用Jython会抛出错误。

Jython无法导入所有只保存在文件夹中的编译版本的库,而不是类代码本身。与multiarray.py不同,它只有multiarray.pyd,它是编译版本,所以它不会在Jython中被检测到。

为什么会出现这种行为?如何解决?

请帮忙!

2 个答案:

答案 0 :(得分:2)

我知道这是一个旧线程,但我最近遇到了同样的问题,并且能够解决它,我认为解决方案应该在这里以防将来有人遇到它。如上所述,Jython无法处理numpy的预编译c文件,但在nltk中,numpy的使用非常有限,重写受影响的代码位相当简单。这就是我所做的,我确信它不是计算效率最高的解决方案,但它确实有效。这段代码可以在nltk.metrics.Segmentation中找到,我只会粘贴相关的代码,但它仍然会有点多。

def _init_mat(nrows, ncols, ins_cost, del_cost):
    mat = [[4.97232652e-299 for x in xrange(ncols)] for x in xrange(nrows)]
    for x in range(0,ncols):       
        mat[0][x] = x * ins_cost
    for x in range(0, nrows):
        mat[x][0] = x * del_cost
    return mat

def _ghd_aux(mat, rowv, colv, ins_cost, del_cost, shift_cost_coeff):
    for i, rowi in enumerate(rowv):
        for j, colj in enumerate(colv):          
            shift_cost = shift_cost_coeff * abs(rowi - colj) + mat[i][j]
            if rowi == colj:
                # boundaries are at the same location, no transformation required
                tcost = mat[i][j]
            elif rowi > colj:
                # boundary match through a deletion
                tcost = del_cost + mat[i][j + 1]
            else:
                # boundary match through an insertion
                tcost = ins_cost + mat[i + 1][j]
            mat[i + 1][j + 1] = min(tcost, shift_cost)

同样在ghd的末尾,将return语句更改为

return mat[-1][-1]

我希望这有助于某人!我不知道是否还有其他地方存在任何问题,但这是我遇到的唯一问题。如果还有其他类似的问题,可以用相同的方式解决(使用列表而不是numpy数组),再次,你可能会失去一些效率,但它可以工作。

答案 1 :(得分:1)

jython是Java。 Numpy的部分实现为Python(.pyd文件)的c扩展。一些部分实现为.py文件,这在Jython中可以正常工作。但是,它们不能在不访问C级代码的情况下运行。目前,现在在jython中使用numpy。参见:

Using NumPy and Cpython with Jython 要么 Is there a good NumPy clone for Jython?

最近有关替代品的讨论。