Interruzioni naturali PySAL dall'array Numpy


11

Sto tentando di estrarre i valori di rottura naturali da un raster usando Python.

Il processo previsto va: dall'oggetto raster Arcpy all'array NumPy (utilizzando RasterToNumPyArray ) ai valori di interruzione naturale (utilizzando la funzione Interruzioni naturali PySAL ).

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)

Questo codice restituisce l'errore "ValueError: la matrice deve essere bidimensionale".

Per quanto ne so, greenArray è un array bidimensionale.


1
Hai provato a controllare le dimensioni di greenArray prima di tentare di elaborarlo con Natural_Breaks? Sembra che chiamare .shape sull'array ti darà le dimensioni dell'array. Non ho mai fatto nulla di simile prima, ma questo post sembra utile ... stackoverflow.com/questions/3061761/numpy-array-dimensions
Branco

1
Grazie Branco. Mi sono imbattuto in quel thread, il che mi ha portato a credere che il mio array fosse bidimensionale. Il ritorno di greenArray.shape = (1536,2048) e greenArray.ndim = 2. Penso di aver trovato una soluzione (usando numpy.ravel ()), che scriverò tra poco.
floema

1
@phloem Guardando il docco di PySAL penso che tu abbia ragione nell'usare flattene ravel; il Natural_Breakssembra accettare solo un 1d vettore di valori (o, un (n, 1)vettore).
om_henners,

Risposte:


6

Grazie per l'aiuto, Branco e om_henners.

La risposta al mio problema sembra essere l'uso di numpy.ravel () per cambiare l'array prodotto da arcpy.RasterToNumPy () in un array 1D:

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.