Python 将三维numpy转换为阵列而不更改为4D阵列

Python 将三维numpy转换为阵列而不更改为4D阵列,python,arrays,numpy,gdal,Python,Arrays,Numpy,Gdal,我有一个光栅图像与10个波段和读取它作为阵列 file = "test.tif" ds = gdal.Open(file) arr = ds.ReadAsArray() 3D阵列的最终形状如下所示:(n_波段,y_像素,x_像素) 但是,我要使用的软件需要4D阵列作为输入: (n_图像、n_像素、n_像素、n_x、n_波段) 是否有方法将光栅读取为具有4D阵列指定属性的阵列,或将3D阵列转换为4D阵列 我试着使用np.reforme,但它改变了像素的位置 array([[[3344, 3344

我有一个光栅图像与10个波段和读取它作为阵列

file = "test.tif"
ds = gdal.Open(file)
arr = ds.ReadAsArray()
3D阵列的最终形状如下所示:(n_波段,y_像素,x_像素)

但是,我要使用的软件需要4D阵列作为输入: (n_图像、n_像素、n_像素、n_x、n_波段)

是否有方法将光栅读取为具有4D阵列指定属性的阵列,或将3D阵列转换为4D阵列

我试着使用np.reforme,但它改变了像素的位置

array([[[3344, 3344, 3344, ..., 8001, 8001, 8001],
    [3344, 3344, 3344, ..., 8001, 8001, 8001],
    [3344, 3344, 3344, ..., 8001, 8001, 8001],
    ...,
    [2359, 2359, 2359, ..., 7106, 7106, 7106],
    [2359, 2359, 2359, ..., 7106, 7106, 7106],
    [2359, 2359, 2359, ..., 7106, 7106, 7106]],
   ...,
    [[3173, 3173, 3431, ..., 5658, 5463, 5463],
    [3173, 3173, 3431, ..., 5658, 5463, 5463],
    [3393, 3393, 3487, ..., 5767, 5536, 5536],
    ...,
    [1751, 1751, 1722, ..., 2753, 2534, 2534],
    [1395, 1395, 1415, ..., 2672, 2521, 2521],
    [1395, 1395, 1415, ..., 2672, 2521, 2521]]], dtype=uint16)

arrn=arr.reshape(1,y_pixels,x_pixels,10)

array([[[[3344, 3344, 3344, ..., 2122, 2122, 2122],
     [2122, 2122, 1378, ..., 1378, 1420, 1420],
     [1420, 1420, 1420, ..., 1435, 1435, 1435],
     ...,
     [8753, 8753, 8753, ..., 8086, 8086, 8086],
     [8086, 8086, 6949, ..., 6949, 7091, 7091],
     [7091, 7091, 7091, ..., 7633, 7633, 7633]],
    ...,
     [[1944, 1944, 1885, ..., 1846, 1795, 1795],
     [1645, 1645, 1366, ..., 1605, 1706, 1706],
     [1723, 1723, 1854, ..., 2182, 2270, 2270],
     ...,
     [3057, 3057, 3059, ..., 3150, 3195, 3195],
     [3249, 3249, 3180, ..., 3178, 3165, 3165],
     [3145, 3145, 3056, ..., 2672, 2521, 2521]]]], dtype=uint16)

要将n_标注栏轴移动到末端,并在前面添加尺寸标注
.reforme
无法知道您想要这样做,只需重新解释新形状中的数据。但您可以手动将其分为两个步骤,以保持像素的正确顺序:

arr  # shape (n_bands, y_pixels, x_pixels)
swapped = np.moveaxis(arr, 0, 2)  # shape (y_pixels, x_pixels, n_bands)
arr4d = np.expand_dims(swapped, 0)  # shape (1, y_pixels, x_pixels, n_bands)

你所说的“
np.重塑
改变数据结构”是什么意思?这不是重塑任务。这是轴心互换。使用axis order参数尝试
np,transpose
,不幸的是,交换轴会改变像素的顺序,并且生成的图像像素不会与源数据重叠。事实上,交换确实会弄乱x/y。我已经编辑了使用moveaxis的答案,它应该保留y轴和x轴的顺序。