2012-08-07 53 views
1

我有一個不包含數據值的numpy數組。我掩蓋那些沒有數據值,使他們不使用影響我算了一筆賬:memove一個蒙面數組 - python

array = numpy.ma.masked_values(array, options['ndv'], copy=False) 

然後我用的memmove使用的numpy的陣列進入一個共享的ctypes陣列:

def ndarray_to_shmem(array): 
    """ Converts a numpy.ndarray to a multiprocessing.Array object. 

    The memory is copied, and the array is flattened. 
    """ 
    arr = array.reshape((-1,)) 
    data = RawArray(_numpy_to_ctypes[array.dtype.type], 
            arr.size) 
    ctypes.memmove(data, array.data[:], len(array.data)) 
    return data 

它返回以下堆棧跟蹤:

ctypes.memmove(data, array.data[:], len(array.data)) 
ctypes.ArgumentError: argument 2: <type 'exceptions.TypeError'>: wrong type 

是否有可能使用的memmove到掩蔽陣列移動到共享,ctypes的數組?

+0

當您移動蒙版陣列時,究竟發生了什麼?你是否希望只獲得沒有被掩蓋的價值觀?無價值的條目應該轉換爲南? – Luke 2012-08-07 23:32:43

+0

轉換爲NaN。然後在執行一些計算後,我將轉換回輸入的無數據值。 – Jzl5325 2012-08-08 00:04:53

回答

2

首先,你需要改變這一行:

ctypes.memmove(data, array.data[:], len(array.data)) 

看起來像這樣:

ctypes.memmove(data, array.data[:].ctypes.data, len(array.data)) 

,ctypes.memmove沒有蒙面陣列的理解。相反,只需將蒙版區域設置爲nan即可複製:

masked = array.copy() 
masked[array == options['ndv']] = np.nan 

... 

ctypes.memmove(data, masked.ctypes.data, len(masked)) 
+0

盧克,爲什麼第一個項目?剛剛通過numpy文檔偶然發現了第二條,這要歸功於您的初始評論。謝謝! – Jzl5325 2012-08-08 00:29:18

+0

使用array.ctypes.data的要求是因爲ctypes沒有理解numpy數組(給定一個numpy數組,ctypes不知道如何找到它包含的數組數據)。屬性array.ctypes.data只是一個指向包含在內的內存數組的指針,這是ctypes能夠理解的。 – Luke 2012-08-08 00:36:17