Michael Tobis wrote: > Proving yet again that it's possible to write Fortran in any language. > Ouch...
> You aren't getting any benefit from numpy or python here. Are you > aiming for speed or legibility? > Speed will be a necessity, eventually. I was just really aiming for something that works, and that I am capable of writing. > Also, with this code, you are using radius for the dimensions of the > enclosing box, as well as the radius of the circle, so it's guaranteed > to not to actually produce a whole circle. Recall what python does with > negative indices! > I'm not sure what you mean here. It produces an eighth-circle, and then plots each point in the 8 symmetrical positions on the circle. Except for the (dx+1) point made above, what piece of the circle is missing? > I'll bet this does the trick for you and runs faster than what you've > got > > def circle(rad = 5,max_x = 20, max_y = 20,cx = 10, cy= 10, value=255): > radsq = rad * rad > return numpy.array([[((x - cx) ** 2 + (y - cy) ** 2 < radsq) and > value or 0 for x in range(max_x)] for y in range(max_y)],'u') > > I think the pure numpy solution should be something like (untested) > > def circle(rad = 5,max_x = 20, max_y = 20,cx = 10, cy= 10, value=255): > def sqdist(x,y): > return (x - cx) * (x - cx) + (y - cy) * (y - cy) > distarray = numpy.fromfunction(sqdist,(max_y,max_x)) > return > numpy.asarray(numpy.choose(greater(distarray,rad*rad),(0,value),'u') > I'll take a look at both of these. At this point, I can't quite wrap my head around what you're doing for either one. > Neither approach will get you the eightfold speedup that the messy code > was aimed at, but in practice they will spend less time at the > interpreter level and will likely run faster. > > mt -- http://mail.python.org/mailman/listinfo/python-list