2011-08-05 7 views
2

자이 썬을 사용하여 파일 및 메서드를 호출하려고하면 Numpy, Python 및 NLTK가 올바르게 설치되어 있고 Python에서 직접 실행하면 제대로 작동하지만 다음 오류가 표시된다. 내가 클래스 PreProcessing을 포함하고 잘 작동 방법의 전처리를 호출 파이썬의 파일을 실행하면자이 썬 : ImportError : 모듈 이름이 다중 배열

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

하지만, 자이 썬으로는 오류가 발생합니다 :

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

쉘 내가 사용하고 코드는 간단 하나입니다 .

자이 썬은 클래스 코드 자체가 아닌 폴더에 보관 된 컴파일 된 버전 만 가진 라이브러리를 모두 가져올 수 없다. multiarray.py 대신 multiarray.pyd 만 컴파일 된 버전이므로 자이 썬에서는 감지되지 않습니다.

왜이 동작을 보이고 있습니까? 그것을 해결하는 방법?

도와주세요!

+0

질문에 답변 했습니까? 그렇다면, 그 것으로 표시하십시오. 감사! –

답변

1

자이 썬은 자바입니다. Numpy의 일부는 Python (.pyd 파일)에 대한 c 확장으로 구현됩니다. 일부 파트는 .py 파일로 구현되며, 자이 썬에서 정상적으로 작동합니다. 그러나 C 레벨 코드에 대한 액세스가 없으면 작동 할 수 없습니다. 현재 자이 썬에서는 numpy를 사용할 수있다. 참조 :

Using NumPy and Cpython with Jython 또는 대안에 대한 최근의 논의에 대한 Is there a good NumPy clone for Jython?

.

+0

하지만 내가 직면하고있는 문제는 조금 다릅니다. Numpy는 이미 컴파일 된 파일 하나를 제외한 모든 작업을하고 있습니다. 파일이 컴파일 된 클래스가 아닌 코드 일 뿐이라면 – ninja123

+0

맞습니다. 컴파일 된 클래스는 C 코드로 컴파일됩니다. 소스 코드가있는 클래스는 잘 작동하지만 독립적으로 작동하지는 않습니다. 나는 아직도 자이 썬에서 numpy를 대신하는 좋은 대안을 찾고있다. 내가 찾으면 알려줘! –

+0

나는 numpy의 부분 만 컴파일된다는 것을 명확히하기 위해 나의 대답을 편집했다. Pure Python 구성 요소는 Jython에서 작동합니다. 컴파일 된 부분은 그렇지 않습니다. –

2

나는 이것이 이전의 스레드라는 것을 알고 있지만, 나는이 동일한 문제를 최근에 만났으며이를 해결할 수 있었고 미래의 누군가가 그것을 실행해야 할 경우 솔루션이 있어야한다고 생각한다. 위와 같이 자이 썬은 numpy의 미리 컴파일 된 c 파일을 처리 할 수 ​​없지만 nltk에서는 numpy를 사용하는 것이 매우 제한적이며 영향을받는 코드 비트를 다시 작성하는 것은 매우 간단합니다. 그것이 내가 한 일이며, 가장 계산 상 효과적인 솔루션이 아니라고 확신합니다. 그러나 작동합니다. 이 코드는 nltk.metrics.Segmentation에서 찾아 볼 수 있으며 관련 코드 만 붙여 넣습니다.하지만 여전히 조금 있습니다.

GHD의 말에 또한
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) 

return mat[-1][-1] 

나는이 사람을 도움이되기를 바랍니다에 return 문을 변경! 이것이 어떤 문제가있는 다른 곳이 있는지 나는 모른다. 그러나 이것이 내가 만난 유일한 길이다. 이러한 종류의 다른 문제가있는 경우 동일한 방법으로 (numpy 배열 대신 목록을 사용하여) 해결할 수 있습니다. 다시 한 번 효율성을 잃을 수도 있지만 작동합니다.