2017-05-11 2 views
3

dotNET/pythonnet 용 Python 3.6 및 Python을 사용하여 이미지 배열을 보유해야합니다. 이것은 System.Single 타입입니다.System.Single [,]를 numpy 배열로 효율적으로 변환합니다.

파이썬에서 실제로 뭔가 할 수 있도록 numpy 배열로 변환하고 싶습니다. 해당 배열을 단계별로 처리하고 요소별로 변환하는 함수를 설정했습니다. 그러나 사용할 수있는 더 현명한 (그리고 더 빠름) 무언가가 있습니까?

def MeasurementArrayToNumpy(TwoDArray): 
    hBound = TwoDArray.GetUpperBound(0) 
    vBound = TwoDArray.GetUpperBound(1) 

    resultArray = np.zeros([hBound, vBound]) 

    for c in range(TwoDArray.GetUpperBound(0)):    
      for r in range(TwoDArray.GetUpperBound(1)): 
       resultArray[c,r] = TwoDArray[c,r] 
    return resultArray 
+0

아래의 코드에서 사람들을 포함했다? –

+0

예, 그렇게 해 줬습니다. 그것은 'array (, dtype = object)' – rbp109

+0

NumPy가 이해하는 방식으로 반복을 구현하지 않는 것 같습니다. 당신이하고있는 일은 이미 그것이 할 수있는 최선이라고 생각합니다. –

답변

3

@denfromufa - 이것은 매우 유용한 링크입니다.

Marshal.Copy 또는 np.frombuffer를 사용하여 직접 메모리 복사본을 만드는 것이 좋습니다. Marshal을 가져올 수 없었습니다. 복사 버전이 작동합니다. 일부 속임수는 마샬 (Marshal)을 사용하여 2D 배열을 사용해야하며 배열의 내용을 어떻게 든 변경했습니다.하지만 np.frombuffer 버전은 저에게 효과적이며 3296 * 2471 어레이 (~ 25s -> ~ 1.50ms)에서 ~ 16000의 인수로 완료하는 데 걸리는 시간. 이것은 나의 목적

방법은 몇 가지 더 수입을 필요로 충분히 좋은, 그래서 당신은`numpy.array (TwoDArray)`봤어

import ctypes 
from System.Runtime.InteropServices import GCHandle, GCHandleType 

def SingleToNumpyFromBuffer(TwoDArray): 
    src_hndl = GCHandle.Alloc(TwoDArray, GCHandleType.Pinned) 

    try: 
     src_ptr = src_hndl.AddrOfPinnedObject().ToInt32() 
     bufType = ctypes.c_float*len(TwoDArray) 
     cbuf = bufType.from_address(src_ptr) 
     resultArray = np.frombuffer(cbuf, dtype=cbuf._type_) 
    finally: 
     if src_hndl.IsAllocated: src_hndl.Free() 
    return resultArray 
+0

이것이 당신에게 도움이 되었기 때문에 기쁩니다! 프로젝트에 위키로 제공하십시오. – denfromufa

관련 문제