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

2024-05-17 12:00:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我使用的代码很简单:

^{pr2}$

当我只运行包含类PreProcessing并调用方法preprocess的python文件时,它工作得很好,但是对于Jython,它抛出错误。在

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

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

请帮忙!在


Tags: 方法代码py版本numpylib错误jython
2条回答

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?

最近关于替代方案的讨论。在

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

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语句更改为

^{pr2}$

我希望这对某人有帮助!我不知道是否还有其他地方会有这样的问题,但这是我遇到的唯一一个问题。如果还有其他类似的问题可以用同样的方法解决(使用列表列表而不是numpy数组),同样,您可能会损失一些效率,但它是有效的。在

相关问题 更多 >