Как преобразовать трехмерный массив в двумерный массив, сохранив размер по оси Z - PullRequest
0 голосов
/ 09 октября 2019

enter image description here Я создал массив из стека изображений. Изображения имеют размер 10980 * 10980. Я использовал dask, чтобы читать изображения и складывать их, используя подход ленивых массивов. Всего их 68. Я использовал следующий код:

import dask
import dask.array as da
import glob
import time
import os

filenames = [os.path.join(root, filename) for root, subdir, filenames in os.walk("L2A")
            for filename in filenames if filename.endswith("B04_10m.tif")]

print(len(filenames))

import imageio 
sample = imageio.imread(filenames[0])
sample.shape

import matplotlib.pyplot as plt 
import skimage.io 
plt.figure(figsize=(10,10))
skimage.io.imshow(sample[:,:])

lazy_arrays = [dask.delayed(imageio.imread)(fn) for fn in filenames]

lazy_arrays = [da.from_delayed(x, shape=sample.shape, dtype=sample.dtype)
              for x in lazy_arrays]

array = da.stack(lazy_arrays, axis=0)
array

Форма массива: Shape (68, 10980, 10980). Однако мне хотелось бы иметь двухмерный массив, сохраняющий размер по оси z (68),который будет в новом 2d-массиве, а измерения 10980 и 10980 (строки и столбцы в 3D-массиве) будут столбцами в новом 2d-массиве. В конце я ищу форму (68, 120560400). Кто-нибудь знает как это сделать? Цель состоит в том, чтобы вычислить среднее значение стека, поскольку выполнение этого с использованием вложенного цикла for для итерации по столбцам и строкам трехмерного измерения будет очень длинным с использованием следующей функции.

    x = array.shape[1]
    y = array.shape[2]
    values = np.empty((x,y), type(array[0][0][0]))
    for i in range(x):
        for j in range(y):
            values[i][j] = ((np.mean(array[:,i,j])))

1 Ответ

2 голосов
/ 10 октября 2019

Если у вас есть «куча многомерных вещей» в виде единого массива, например, набора изображений, тогда лучше использовать первое измерение для индексации отдельных вещей .

Это все упрощает. Выбор n-го изображения всего лишь array[n-1], и вы можете легко сгладить все изображения в массиве, сохраняя при этом разделенные изображения, как вам нужно, просто array.reshape((array.shape[0], -1)).

Примечание : мыможете использовать -1 в одном из измерений, чтобы попросить numpy рассчитать для нас соответствующий размер, который в вашем случае будет вычислен как 10980*10980.

...