On Fri, Feb 27, 2009 at 08:04:30PM -0800, Lenard Lindstrom wrote:
> Marius Gedminas wrote:
>> Since I'm really clueless about
>> Numeric/numarray/numpy, please tell me if this code has any obvious
>> shortcomings:
>>
>> # initialization, done once
>> import pygame
>> import numpy
>> image = pygame.image.load('title.png') # has an alpha channel
>> mask = pygame.surfarray.array_alpha(image)
>>
>> # this is done once every frame
>> array = pygame.surfarray.pixels_alpha(image)
>> alpha = 42.5 # a float varying between 1 and 255
>> array[...] = (mask * alpha / 255).astype('b')
>>
> Well, alpha and 255 are both scalars, so (mask * (alpha / 255)) saves
> one intermediate array. Also the preferred NumPy convention is to use
> dtypes (data-types) rather than type characters: .astype(numpy.uint8).
I was using Numeric.UnsignedInt8 before, and couldn't find the NumPy
version of that in a hurry. dir(array) showed me a typecode() method
which returned things like 'b', and so I tried those.
> But arithmetic operations have ufunc equivalents which take an optional
> output array. This means the astype(), along with its intermediate
> array, can be removed. It probably also means the intermediate array
> float array goes away as well. So it is likely this alternative uses no
> intermediate arrays.
>
> ## array = pygame.surfarray.pixels_alpha(image)
> alpha = 42.5
> ## array[...] = (mask * alpha / 255).astype('b')
> numpy.multiply(mask, alpha / 255, pygame.surfarray.pixels_alpha(image))
Unfortunately this gives me a TypeError: return arrays must be of ArrayType
Marius Gedminas
--
... Another nationwide organization's computer system crashed twice in less
than a year. The cause of each crash was a computer virus....
-- Paul Mungo, Bryan Glough _Approaching_Zero_
(in 1986 computer crashes were something out of the ordinary. Win95 anyone?)
Attachment:
signature.asc
Description: Digital signature