Dear ArcPy/Python Users,
I am working on four MODIS datasets on the same tile. I reclassified the map into boolean (1 and 0) based on some criteria. My objective is to have a reclassified map which contains some values based on the combination of values for each pixel from my four MODIS dataset. For instance, each pixel of my four rasters would contain one of the possible combinations, i.e., (1,1,0,0) the values are based on the sequence of my rasters -- (pixel value raster 1, pixel value raster 2, ...).
How can I convert this to 1100?
Another example would be:
>>> a = np.array([1,2,3,4])
>>> b = np.array([5,6,7,8])
>>> c = np.array([9,10,11,12])
>>> d = np.array([4,7,8,9])
>>> x
array([[[ 1, 5, 9, 4],
[ 2, 6, 10, 7],
[ 3, 7, 11, 8],
[ 4, 8, 12, 9]]])
convert the items to 1594, 26107, 37118, 48129
then for instance 1594 will be reclassified to say 2120
The reason is that, I have a dictionary variable (see below) which will reclassify the values for each possible combination. So in the end I will have an array of, i.e., from 1100 to 2120.
The corresponding values are representative on the number of occurrence and the sequence of that event. For instance the 1100 will be reclassified into 2120 -- this means the event of interest occurred twice in week 1 and week 2.
{1000:1100,
0100:1200,
0010:0130,
0001:1400,
1001:2140,
1100:2120,
0110:2230,
0011:2340,
1011:3134,
1101:3124,
1110:3123,
0111:3234,
1111:4111,
0000:1
255,255,255,255 = 0}
Here is the code that I am trying to complete and run but I am stuck now:
# import arcpy module of arcgis import arcpy, os, sys from arcpy import env # import spatial extension from arcpy.sa import * arcpy.env.overwriteOutput = True # activate spatial extension arcpy.CheckOutExtension("Spatial") # environment settings arcpy.env.extent = "MAXOF" # workspace arcpy.env.workspace = r'raster\directory' rasters = arcpy.ListRasters("*", "tif") # output workspace out_ws = 'output/workspace/' rastersCount = len(rasters) counter = 0 # starting index pixReclass = {1000:1100, 0100:1200, 0010:0130, 0001:1400, 1001:2140, 1100:2120, 0110:2230, 0011:2340, 1011:3134, 1101:3124, 1110:3123, 0111:3234, 1111:4111, 0000:0} # compute dekad rasters while counter < 4: # I am processing/testing only the first four rasters in my list rast = [] rastMon = [] for i in range(counter,counter+4): #print rasters rast.append(rasters) print "rasters:{}".format(rast) print len(rast) for r in rast: name, ext = r.split(".") crit_Out = out_ws + name + "_reclass.tif" criteria = Raster(r) >= 0001 criteria.save(crit_Out) print criteria vRast = arcpy.RasterToNumPyArray(crit_Out) rastMon.append(vRast) print "number of array:{}".format(len(rastMon)) zipped = np.dstack((rastMon[0], rastMon[1], rastMon[2], rastMon[3])) counter += 4
Hope that I made my query clear.
Thanks for any advice and suggestion.
-Leo
Message was edited by: Leo Kris Palao
Solved! Go to Solution.
Hi Leo, hope I understand your question correctly. How I would approach this would be to use the Times tool (help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//009z0000009p000000.htm). Multiply raster 1 by 1000, raster 2 by 100, raster 3 by 10. Then use Raster Calculator (help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//009z0000009p000000.htm) to add the values of the 4 rasters together. You can then reclass the values of the result using your dictionary.
Note: not sure what's going on with the links today. Usually pasting them results in a clickable link, but that doesn't appear to be happening as usual.
To address your basic problem of concatenating list items, you can use .join():
Strings:
>>> myList = ['1','2','3','4'] >>> ''.join(myList) '1234'
Integers (uses map(), which first calls str() for each item in myList):
>>> myList = [1,2,3,4] >>> ''.join(map(str,myList)) '1234'
Hi Leo, hope I understand your question correctly. How I would approach this would be to use the Times tool (help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//009z0000009p000000.htm). Multiply raster 1 by 1000, raster 2 by 100, raster 3 by 10. Then use Raster Calculator (help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//009z0000009p000000.htm) to add the values of the 4 rasters together. You can then reclass the values of the result using your dictionary.
Note: not sure what's going on with the links today. Usually pasting them results in a clickable link, but that doesn't appear to be happening as usual.