Ошибка типа: в скаляры Python могут быть преобразованы только массивы размера 1 - наблюдения Земли - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь создать сценарий, который будет принимать файл .GTiff в качестве входного аргумента, а затем извлекать некоторую информацию из файла, чтобы создать файл stats.txt, который даст мне classID, дробное покрытие и общее число пикселей этого classID.

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

#!/usr/bin/env python

import sys
import calendar
import os

import gdal
import numpy as np
from scipy.stats import mode

from IPython import embed

GDAL2NUMPY = {  gdal.GDT_Byte      :   np.uint8,
                gdal.GDT_UInt16    :   np.uint16,
                gdal.GDT_Int16     :   np.int16,
                gdal.GDT_UInt32    :   np.uint32,
                gdal.GDT_Int32     :   np.int32,
                gdal.GDT_Float32   :   np.float32,
                gdal.GDT_Float64   :   np.float64,
                gdal.GDT_CInt16    :   np.complex64,
                gdal.GDT_CInt32    :   np.complex64,
                gdal.GDT_CFloat32  :   np.complex64,
                gdal.GDT_CFloat64  :   np.complex128
              }


#Open the original training data .tif map file.

fname = sys.argv[1]
lc_dataset = gdal.Open(fname)
lc = lc_dataset.ReadAsArray()
lc = np.array(lc)

#Calculating total number of pixels with a valid Land Cover ID.

fill_value = 0
number_of_pixels = np.where(lc != fill_value)[0].shape[0]

#Get the number of classes and corresponding IDs.

lc_classes = np.unique(lc)

#Split each class into its contituante pixel and write result to file.

for classID in range(1, lc_classes):
    lc_class_pixels = np.where(lc == classID)[0].shape[0]
    FractionalCover = lc_class_pixels/number_of_pixels
    f.write(classID, FractionalCoverage, lc_class_pixels)

f.close()

Когда я запускаю это, он запускает следующую трассировку:

Traceback (most recent call last):
  File "GeneratingLCstats.py", line 45, in <module>
    for classID in range(1, lc_classes):
TypeError: only size-1 arrays can be converted to Python scalars

Я попытался внести несколько изменений, так как уверен, что ошибка связана с пустыми данными и взаимодействиями с собственными данными Python, но преобразование всех моих массивов в пустые и попытка переформатировать код оказалось тщетной ошибкой сохраняется.

Если кто-нибудь может предложить исправление, которое будет весьма признательно!

Спасибо.

1 Ответ

0 голосов
/ 25 января 2019

Ну, функция lc_classes = np.unique(lc) возвращает массив.Когда вы пытаетесь записать цикл for как

for classID in range(1, lc_classes)

Здесь lc_classes - это массив, и попытка задать его в качестве границы для range вызывает ошибку.Если вы хотите выполнить итерацию по длине массива, вы можете изменить код на:

for classID in range(1, len(lc_classes))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...