[Numpy-discussion] numpy-izing a loop

Paul Rudin paul at rudin.co.uk
Wed Feb 11 03:25:40 EST 2009


Stéfan van der Walt <stefan at sun.ac.za> writes:

> 2009/2/10 Stéfan van der Walt <stefan at sun.ac.za>:
>> x = np.arange(dim)
>> y = np.arange(dim)[:, None]
>> z = np.arange(dim)[:, None, None]
>
> Do not operate heavy machinery or attempt broadcasting while tired or
> under the influence.  That order was incorrect:
>
>> z = np.arange(dim)
>> y = np.arange(dim)[:, None]
>> x = np.arange(dim)[:, None, None]

Thanks to you both. I can confirm that the two functions below give the
same result - as far as my comprehensive testing of one example shows :)

def compute_voxels(depth_buffers):
    assert len(depth_buffers) == 6
    dim = depth_buffers[0].shape[0]
    znear, zfar, ynear, yfar, xnear, xfar = depth_buffers
    result = numpy.empty((dim, dim, dim), numpy.bool)
    for x in xrange(dim):
        for y in xrange(dim):
            for z in xrange(dim):
                result[x, y, z] = ((xnear[y, z] < xfar[y, z]) and 
                                   (ynear[x, z] < yfar[x, z]) and
                                   (znear[x, y] < zfar[x, y]))
    return result

def compute_voxels2(depth_buffers):
    dim = depth_buffers[0].shape[0]
    znear, zfar, ynear, yfar, xnear, xfar = depth_buffers
    z = numpy.arange(dim)
    y = numpy.arange(dim)[:, None]
    x = numpy.arange(dim)[:, None, None]

    return  ((xnear[y,z] < xfar[y, z]) &
             (ynear[x, z] < yfar[x, z]) &
             (znear[x,y] < zfar[x,y]))


All that remains is for me to verify that it's actually the result I want :)

(Well - I also need to learn to spot these things for myself, but I
guess the intuition comes with practice.)




More information about the NumPy-Discussion mailing list