PySAL естественные разрывы из массива Numpy

11

Я пытаюсь извлечь естественные значения разрыва из растра, используя Python.

Предполагаемый процесс: растровый объект Arcpy в массив NumPy (с использованием RasterToNumPyArray ) для естественных значений разрыва (с использованием функции PySAL Natural Breaks ).

import arcpy, pysal
from pysal.esda.mapclassify import Natural_Breaks as nb
# code to create greenIndex arcpy Raster object here
greenArray = arcpy.RasterToNumPyArray(greenIndex)
breaks = nb(greenArray,k=2,initial=20)

Этот код возвращает ошибку «ValueError: матрица должна быть двухмерной».

Насколько я знаю, greenArray - это двумерный массив.

флоэма
источник
1
Вы пробовали проверить размеры greenArray, прежде чем пытаться обработать его с помощью Natural_Breaks? Похоже, вызов .shape для массива даст вам размеры массива. Я не делал ничего из этого раньше, но этот пост кажется полезным ... stackoverflow.com/questions/3061761/numpy-array-dimensions
Branco
1
Спасибо, Бранко. Я наткнулся на эту нить, которая заставила меня поверить, что мой массив был двумерным. Возврат greenArray.shape = (1536,2048) и greenArray.ndim = 2. Я думаю, что я нашел решение (используя numpy.ravel ()), которое я напишу в ближайшее время.
флоэма
1
@phloem Глядя на PySAL Docco, я думаю, что вы правы с использованием flattenи ravel; Natural_Breaks, кажется, принимает только 1d вектор значений (или просто (n, 1)вектор).
om_henners

Ответы:

6

Спасибо за помощь, Бранко и om_henners.

Похоже, что ответом на мою проблему является использование numpy.ravel () для изменения массива, созданного arcpy.RasterToNumPy (), на одномерный массив:

import arcpy, pysal
from pysal.esda.mapclassify import Natural_Breaks as nb
# code to create greenIndex arcpy Raster object here
greenArray = arcpy.RasterToNumPyArray(greenIndex)
breaks = nb(greenArray.ravel(),k=2,initial=20)
флоэма
источник