quickly looping over a 2D array?
Martin
mdekauwe at gmail.com
Mon Jul 27 16:01:18 CEST 2009
On Jul 27, 2:17 pm, Peter Otten <__pete... at web.de> wrote:
> Martin wrote:
> > On Jul 27, 1:46 pm, Peter Otten <__pete... at web.de> wrote:
> >> Martin wrote:
> >> > On Jul 27, 12:42 pm, Peter Otten <__pete... at 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
More information about the Python-list
mailing list