[Numpy-discussion] broacasting question

Derek Homeier derek@astro.physik.uni-goettingen...
Thu Jun 30 13:11:45 CDT 2011

On 30.06.2011, at 7:32PM, Thomas K Gamble wrote:

> I'm trying to convert some IDL code to python/numpy and i'm having some 
> trouble understanding the rules for boradcasting during some operations.
> example:
> given the following arrays:
> a = array((2048,3577), dtype=float)
> b = array((256,25088), dtype=float)
> c = array((2048,3136), dtype=float)
> d = array((2048,3136), dtype=float)
> do:
> a = b * c + d
> In IDL, the computation is done without complaint and all array sizes are 
> preserved.  In ptyhon I get a value error concerning broadcasting.  I can 
> force it to work by taking slices, but the resulting size would be a = 
> (256x3136) rather than (2048x3577).  I admit that I don't understand IDL (or 
> python to be honest) well enough to know how it handles this to be able to 
> replicate the result properly.  Does it only operate on the smallest 
> dimensions ignoring the larger indices leaving their values unchanged?  Can 
> someone explain this to me?

If IDL does such operations silently I'd probably rather be troubled about it...
Assuming you actually meant something like "a = np.ndarray((2048,3577))" (because np.array((2048,3577), dtype=float) would simply be the 2-vector [ 2048. 3577.]), the shape of a indeed matches in no way the other ones. 
While b,c,d do have the same total size, thus something like

b.reshape((2048,3136) * c + d 

will work, meaning the first 8 rows of b b[:8] would be concatenated to the first row of the output, and so on... 
Since the total size is still smaller than a, I could only venture something is done like 

np.add(b.reshape(2048,3136) * c, d, out=a[:,:3136])

But to say whether this is really the equivalent result to what IDL does, one would have to study the IDL manual in detail or directly compare the output (e.g. check what happens to the values in a[:,3136:]...)


More information about the NumPy-Discussion mailing list