2013-09-30 15 views
9

Tôi đang làm việc với các mảng khá lớn được tạo từ các tệp hình ảnh lớn. Tôi gặp sự cố khi sử dụng quá nhiều bộ nhớ và quyết định thử sử dụng các mảng numpy.memmap thay vì tiêu chuẩn numpy.array. Tôi đã có thể tạo ra một memmap và tải dữ liệu vào nó từ tập tin hình ảnh của tôi trong khối, nhưng tôi không chắc chắn làm thế nào để tải kết quả của một hoạt động vào một memmap.numpy.memmap từ các hoạt động khó khăn

Ví dụ: tệp hình ảnh của tôi được đọc thành numpy dưới dạng mảng số nguyên nhị phân. Tôi đã viết một hàm mà bộ đệm (mở rộng) bất kỳ vùng nào của các ô True theo số lượng ô được chỉ định. Hàm này chuyển đổi mảng đầu vào thành Boolean bằng cách sử dụng array.astype(bool). Làm cách nào để tạo mảng Boolean mới được tạo bởi array.astype(bool) một mảng numpy.memmap?

Ngoài ra, nếu có ô True gần cạnh của mảng đầu vào hơn khoảng cách đệm được chỉ định, hàm sẽ thêm hàng và/hoặc cột vào cạnh của mảng để cho phép bộ đệm hoàn chỉnh xung quanh True ô. Điều này thay đổi hình dạng của mảng. Có thể thay đổi hình dạng của numpy.memmap không?

Đây là mã của tôi:

def getArray(dataset): 
    '''Dataset is an instance of the GDALDataset class from the 
    GDAL library for working with geospatial datasets 

    ''' 
    chunks = readRaster.GetArrayParams(dataset, chunkSize=5000) 
    datPath = re.sub(r'\.\w+$', '_temp.dat', dataset.GetDescription()) 
    pathExists = path.exists(datPath) 
    arr = np.memmap(datPath, dtype=int, mode='r+', 
        shape=(dataset.RasterYSize, dataset.RasterXSize)) 
    if not pathExists: 
     for chunk in chunks: 
      xOff, yOff, xWidth, yWidth = chunk 
      chunkArr = readRaster.GetArray(dataset, *chunk) 
      arr[yOff:yOff + yWidth, xOff:xOff + xWidth] = chunkArr 
    return arr 

def Buffer(arr, dist, ring=False, full=True): 
    '''Applies a buffer to any non-zero raster cells''' 
    arr = arr.astype(bool) 
    nzY, nzX = np.nonzero(arr) 
    minY = np.amin(nzY) 
    maxY = np.amax(nzY) 
    minX = np.amin(nzX) 
    maxX = np.amax(nzX) 
    if minY - dist < 0: 
     arr = np.vstack((np.zeros((abs(minY - dist), arr.shape[1]), bool), 
         arr)) 
    if maxY + dist >= arr.shape[0]: 
     arr = np.vstack((arr, 
         np.zeros(((maxY + dist - arr.shape[0] + 1), arr.shape[1]), bool))) 
    if minX - dist < 0: 
     arr = np.hstack((np.zeros((arr.shape[0], abs(minX - dist)), bool), 
         arr)) 
    if maxX + dist >= arr.shape[1]: 
     arr = np.hstack((arr, 
         np.zeros((arr.shape[0], (maxX + dist - arr.shape[1] + 1)), bool))) 
    if dist >= 0: buffOp = binary_dilation 
    else: buffOp = binary_erosion 
    bufDist = abs(dist) * 2 + 1 
    k = np.ones((bufDist, bufDist)) 
    bufArr = buffOp(arr, k) 
    return bufArr.astype(int) 
+0

[trong câu trả lời này] (http://stackoverflow.com/a/16597695/832621) nó được giải thích làm thế nào để đối phó với dữ liệu không liên tục trong bản ghi nhớ, có thể nó sẽ giúp bạn ... –

+0

@SaulloCastro - Cảm ơn bạn đã liên kết. Tôi không thực sự chắc chắn như thế nào áp dụng ở đây. Tôi không xem xét tình trạng của mình liên quan đến dữ liệu không liên tục, nhưng tôi mới có chút vất vả nên tôi có thể sai. – Brian

+0

Tôi đã đăng liên kết đến câu hỏi đó vì nó cung cấp một số thông tin về cách làm việc với các offset thành 'memmap', để truy cập vào khối dữ liệu đã cho, cần thiết trong trường hợp của bạn. –

Trả lời

1

Hãy để tôi cố gắng trả lời phần đầu của câu hỏi của bạn. Tải kết quả vào kho dữ liệu memmap.

Lưu ý Tôi sẽ giả định rằng có một tệp memmap đã có trên đĩa - đó sẽ là tệp đầu vào. Gọi MemmapInput, tạo ra như sau:

fpInput = np.memmap('MemmapInput', dtype='bool', mode='w+', shape=(3,4)) 
del fpInput 
fpOutput = np.memmap('MemmapOutput', dtype='bool', mode='w+', shape=(3,4)) 
del fpOutput 

Trong trường hợp của bạn các tập tin đầu ra có thể không có mặt, nhưng theo tài liệu: 'r +' mở tập tin hiện tại cho đọc và viết.

‘w +’ Tạo hoặc ghi đè tệp hiện có để đọc và viết.

Vì vậy, lần đầu tiên bạn tạo tệp memmap, tệp phải có 'w +', sau đó sửa đổi/ghi đè tệp, sử dụng 'r +', có thể lấy các bản sao chỉ đọc bằng 'r'. Xem http://docs.scipy.org/doc/numpy/reference/generated/numpy.memmap.html để biết thêm thông tin.

Bây giờ chúng ta sẽ đọc trong tệp này và thực hiện một số thao tác trên đó. Điểm chính là tải kết quả vào một tệp memamp, trước tiên phải tạo tệp memmap và đính kèm vào tệp.

fpInput = np.memmap('MemmapInput', dtype='bool', mode='r', shape=(3,4)) 
fpOutput = np.memmap('MemmapOutput', dtype='bool', mode='r+', shape=(3,4)) 

Đỗ bất cứ điều gì bạn muốn với các tập tin fpOutput memmap ví dụ:

i,j = numpy.nonzero(fpInput==True) 
for indexI in i: 
    for indexJ in j: 
    fpOutput[indexI-1,indexJ] = True 
    fpOutput[indexI, indexJ-1] = True 
    fpOutput[indexI+1, indexJ] = True 
    fpOutput[indexI, indexJ+1] = True 
Các vấn đề liên quan