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)
[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 ... –
@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
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. –