我从一堆图像中创建了一个数组。 图像尺寸为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
数组的形状为: 形状(68、10980、10980) 但是我想要的是一个2d数组,它保持沿z轴的尺寸(68),这将是新2d数组中的尺寸,而10980和10980尺寸(3D数组中的行和列)将新的2d数组中的列。 最后,我要寻找的形状是(68,120560400)。有谁知道这是怎么做到的吗?目的是计算堆栈的均值,因为使用嵌套的for循环在3d维度的列和行上进行迭代会非常长,请使用以下函数。
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])))
答案 0 :(得分:2)
当您将“一堆多维事物”作为单个numpy数组(例如图像集)使用时,最好使用第一个维度为单个事物建立索引。
这使一切变得简单。选择第n张图像仅array[n-1]
,您可以轻松地展平数组中的所有图像,而仅需array.reshape((array.shape[0], -1))
就可以使图像分开。
注意:我们可以在其中一个维度中使用-1
,以便让numpy为我们计算合适的大小,在您的情况下,该大小将计算为{{1} }。