[Numpy-discussion] problems with multiple outputs with numpy.nditer

Mark Wiebe mwwiebe at gmail.com
Wed Aug 10 12:15:48 EDT 2011


On Wed, Aug 10, 2011 at 3:45 AM, George Nurser <gnurser at gmail.com> wrote:

> Hi,
> I'm running numpy 1.6.1rc2 + python 2.7.1 64-bit from python.org on OSX
> 10.6.8.
>
> I have a f2py'd fortran routine that inputs and outputs fortran real*8
> scalars, and I normally call it like
>
> tu,tv,E,El,IF,HF,HFI = LW.rotate2u(u,v,NN,ff,0)
>
> I now want to call it over 2D arrays UT,VT,N,f
>
> Using steam-age indexing works fine:
>
> mflux_east,mflux_north,IWE,IWE_lin,InvFr,HFroude =
> np.empty([6,ny-1,nx],dtype=np.float64)
> for j in range(ny-1):
>   for i in range(nx):
>       u,v,NN,ff = [x[j,i] for x in UT,VT,N,f]
>
> mflux_east[j,i],mflux_north[j,i],IWE[j,i],IWE_lin[j,i],InvFr[j,i],HFroude[j,i],HFI
> = LW.rotate2u(u,v,NN,ff,0)
>
>
>
> I decided to try the new nditer option, with
>
> it = np.nditer([UT,VT,N,f,None,None,None,None,None,None,None]
>              ,op_flags=4*[['readonly']]+7*[['writeonly','allocate']]
>              ,op_dtypes=np.float64)
> for (u,v,NN,ff,tu,tv,E,El,IF,HF,HFI) in it:
>   tu,tv,E,El,IF,HF,HFI = LW.rotate2u(u,v,NN,ff,0)
>
>
> Unfortunately this doesn't seem to work. Writing
> aa,bb,cc,dd,ee,ff,gg = it.operands[4:]
>

One problem here is that the assignment needs to assign into the view the
iterator gives, something a direct assignment doesn't actually do. Instead
of

a, b = f(c,d)

you need to write it like

a[...], b[...] = f(c,d)

so that the actual values being iterated get modified. Here's what I get:

In [7]: a = np.arange(5.)

In [8]: b, c, d = a + 1, a + 2, a + 3

In [9]: it = np.nditer([a,b,c,d] + [None]*7,
   ...:         op_flags=4*[['readonly']]+7*[['writeonly','allocate']],
   ...:         op_dtypes=np.float64)

In [10]: for (x,y,z,w,A,B,C,D,E,F,G) in it:
   ....:     A[...], B[...], C[...], D[...], E[...], F[...], G[...] = x, y,
z, w, x+y, y+z, z+w
   ....:

In [11]: it.operands[4]
Out[11]: array([ 0.,  1.,  2.,  3.,  4.])

In [12]: it.operands[5]
Out[12]: array([ 1.,  2.,  3.,  4.,  5.])

In [13]: it.operands[6]
Out[13]: array([ 2.,  3.,  4.,  5.,  6.])

In [14]: it.operands[7]
Out[14]: array([ 3.,  4.,  5.,  6.,  7.])

In [15]: it.operands[8]
Out[15]: array([ 1.,  3.,  5.,  7.,  9.])

In [16]: it.operands[9]
Out[16]: array([  3.,   5.,   7.,   9.,  11.])

In [17]: it.operands[10]
Out[17]: array([  5.,   7.,   9.,  11.,  13.])


-Mark



>
> aa seems to contain the contents of UT (bizarrely rescaled to lie
> between 0 and 1), while bb,cc etc are all zero.
>
>
> I'm not sure whether I've just called it incorrectly, or whether
> perhaps it's only supposed to work with one output array.
>
>
> --George Nurser.
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20110810/bc48679f/attachment.html>


More information about the NumPy-Discussion mailing list