On Jul 27, 2:17 pm, Peter Otten <__pete...@web.de> wrote: > Martin wrote: > > On Jul 27, 1:46 pm, Peter Otten <__pete...@web.de> wrote: > >> Martin wrote: > >> > On Jul 27, 12:42 pm, Peter Otten <__pete...@web.de> wrote: > >> >> Martin wrote: > >> >> > I am new to python and I was wondering if there was a way to speed > >> >> > up the way I index 2D arrays when I need to check two arrays > >> >> > simultaneously? My current implementations is (using numpy) > >> >> > something like the following... > > >> >> > for i in range(numrows): > >> >> > for j in range(numcols): > > >> >> > if array_1[i, j] == some_value or array_2[i, j] >= > >> >> > array_1[i, > >> >> > j] * some_other_value > >> >> > array_1[i, j] = some_new_value > > >> >> array_1[(array_1 == some_value) | (array_2 >= array_1 * > >> >> some_other_value)] = some_new_value > > >> >> maybe? > > >> > So I tried... > > >> > band_1[(array_1 == 255) or (array_2 >= array_1 * factor)] = 0 > > >> > which led to > > >> > ValueError: The truth value of an array with more than one element is > >> > ambiguous. Use a.any() or a.all() > > >> > so not sure that works? > > >> Copy and paste -- or replace "or" with "|". > > > apologies - I mistook that for a type for "or" > > > I now get the following error... > > > ValueError: shape mismatch: objects cannot be broadcast to a single > > shape > > It seems array_1 and array_2 have a -- dada! -- different shape. > Assuming array_1 is the smaller one: > > numrows, numcols = array_1.shape > array_1[(array_1 == some_value) | (array_2[:numrows,:numcols] >= array_1 * > some_other_value)] = some_new_value > > There may be other options, but I'm not a numpy expert. > > Peter
My mistake - the incorrect size in the arrays was my error. The statement works now, but it doesn't give the same results as my original logic, strangely!? in my logic: data = np.zeros((numrows, numcols), dtype = np.uint8, order ='C') for i in range(numrows): for j in range(numcols): if band3[i,j] == 255 or band3[i,j] >= band6[i,j] * factor: data[i,j] = 0 else: data[i,j] = 1 to do the same with what you suggested... data = np.ones((numrows, numcols), dtype = np.uint8, order ='C') data[(band3 == 255) | (band6 >= band3 * factor)] = 0 Thanks -- http://mail.python.org/mailman/listinfo/python-list