【问题标题】:Jython: ImportError: No module named multiarrayJython:ImportError:没有名为 multiarray 的模块
【发布时间】:2011-08-05 12:32:00
【问题描述】:

当我尝试使用 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 文件并调用方法 preprocess 时,它工作正常,但使用 Jython 时会引发错误。

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

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

请帮忙!

【问题讨论】:

  • 我回答你的问题了吗?如果是这样,请将其标记为这样。谢谢!

标签: python numpy nlp jython nltk


【解决方案1】:

我知道这是一个旧线程,但我最近遇到了同样的问题并且能够解决它,我认为解决方案应该在这里,以防将来有人遇到它。如上所述,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 数组),同样,您可能会失去一些效率,但它确实有效。

【讨论】:

    【解决方案2】:

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

    Using NumPy and Cpython with Jython 或者 Is there a good NumPy clone for Jython?

    最近关于替代品的讨论。

    【讨论】:

    • 但我面临的问题有点不同。 Numpy 适用于除了已经编译的文件之外的所有文件。也就是说,如果文件只是它工作的代码而不是编译的类
    • 没错。编译的类是从 C 代码编译的。带有源代码的类应该可以正常工作,但它们不会独立工作。我仍在寻找 Jython 中 numpy 的良好替代品。如果你找到了,请告诉我!
    • 我编辑了我的答案以澄清只有部分 numpy 被编译。纯 Python 组件将在 Jython 中工作。编译的部分不会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 2017-12-30
    • 2018-01-06
    • 2018-11-11
    • 2015-04-10
    • 2013-11-27
    • 2014-02-17
    相关资源
    最近更新 更多