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