I decided to make my grid actually go from -180 -> 180 by amending my code. I basically grabbed the western half of my grid and appended it to the beginning of my file. I then cut off the redundant data. Using Struct.unpack to decode binary data results in a tuple, which cannot be modified, so the first step is to convert to a
#now unpack img data write out the ASCII file data for j in range(nrow): if v: if j% 500 == 0: print 'row:', j #print row # every 500 rows raw_data = img.read(2*ncol) row_tuple = struct.unpack('>'+str(ncol)+'h', raw_data) #now move western half of data to the east row = list(row_tuple) east = row[ncol/2:ncol] row.reverse() east.reverse() row.extend(east) row.reverse() corrected_row = row[0:ncol]
I had to reverse the rows before I could append the data, because the extend command places the data to be appended at the end of the row only. Once the data is correctly added, I simply reverse it back and snip off the extra. I could also just as easily grabbed the first half of the row instead (east = row[0:ncol/2]) and avoided the reversals, but this just happened to be how I worked through it first.
UPDATE: I showed Kurt my code last night and pointed out how I went about switching up the columns in my row variable. He said it was good that I figured out the two long ways, and then he showed me the one line method. Sure, you cannot really modify tuples after they have been created (e.g. no tuple.append or tuple.extend) but you can grab sections of them and switch them around like so:
In [1]: t = (1.2,3.4,5.6,7.8,9.1,10.2) In [2]: t = t[3:] + t[:3] In [3]: t Out[3]: (7.7999999999999998, 9.0999999999999996, 10.199999999999999, 1.2, 3.3999999999999999, 5.5999999999999996)
Applying this method to my code, I can switch up the western and eastern halves of the line I read in from the img file simply by:
#now move western half of data to the east row = row[ncol/2:] + row[:ncol/2]
Thanks - this is good to know!
ReplyDelete