In python (using numpy), I can broadcast an array to a different shape:
>>> import numpy as np
>>> a = np.array([2,3,4])
>>> b = np.zeros((3,2))
>>> b[:,:] = np.zeros((3,2))
>>> b[:,:] = a[:,np.newaxis] #<-- np.newaxis allows `a` to be "broadcasted" to the same shape as b.
>>> b
array([[ 2., 2.],
[ 3., 3.],
[ 4., 4.]])
>>> c = np.zeros((2,3))
>>> c[:,:] = a[np.newaxis,:]
>>> c
array([[ 2., 3., 4.],
[ 2., 3., 4.]])
Is there any way to achieve the same effect in fortran? I have a subroutine which expects a 2D array to be passed in — I would like to “broadcast” my 1-D arrays up to 2-D as I’ve demonstrated above. As it seems that it is likely to matter, my 2D array does have an explicit interface.
As a side note, I thought that this functionality might be provided by the reshape intrinsic, — Something like:
real,dimension(3) :: arr1d
reshape(arr1d, (/3,3/), order=(/1,/1))
but after reading the docs, I don’t think that this is possible since order seems to need to include all the numbers 1 to “N”.
Edit: To be a little more clear, I’m looking for a simply way to create a couple of transforms on an input a such that:
case 1
b(i,j) .eq. a(i) !for all j, or even just j=1,2
and
case 2
b(j,i) .eq. a(i) !for all j, or even just j=1,2
bonus points1 for arbitrary dimensionality:
b(i,j,k) .eq. a(i,j)
b(i,k,j) .eq. a(i,j)
etc.
1disclaimer — I don’t actually have SO super powers to bestow bonus points upon the answerer 😉
I’m not sure what you are trying to accomplish but here are a couple of fragments which may help.
reshapecan take an optional argument, calledpad, which can be used to provide the ‘extra’ elements needed when you reshape into an array with more elements than you started with, say from 3×4 to 2x4x2.You may also be interested in the
spreadfunction which is designed for ‘upranking’ arrays, that is taking a rank-N array in and putting out a rank-N+1 array. The fragment in your second copy could be rewritten asIn this example the second argument is the dimension along which to spread the first argument to make the output. The third argument is the number of copies of the input array to make.
PS The call to
spreadshould perhaps bespread(array1d,1,2), I haven’t checked it.EDIT in response to OP’s editing of question
The two cases, 1 and 2, are satisfied by spreading across dimensions 2 and 1 respectively. In Fortran
and
Since
spreadreturns an array with rank 1 greater than the rank of its first argument, it provides the sought-for arbitrary dimensionality. However, since it’s so space-consuming to show arrays of rank-3 and above I’m not going to.