mgi*_*son 7 python arrays fortran numpy numpy-broadcasting
在python(使用numpy)中,我可以将数组广播为不同的形状:
>>> 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.]])
Run Code Online (Sandbox Code Playgroud)
有没有办法在fortran中达到同样的效果?我有一个子程序,希望2D
传入一个数组 - 我想将我的1-D阵列"广播"到2-D,如上所述.由于它似乎很重要,我的2D数组确实有一个明确的界面.
作为旁注,我认为这个功能可能由reshape
内在提供, - 像:
real,dimension(3) :: arr1d
reshape(arr1d, (/3,3/), order=(/1,/1))
Run Code Online (Sandbox Code Playgroud)
但在阅读完文档之后,我认为这不可能,因为order
似乎需要将所有数字1包括在"N"中.
编辑:为了更清楚一点,我正在寻找一种简单的方法来在输入上创建几个变换,a
这样:
情况1
b(i,j) .eq. a(i) !for all j, or even just j=1,2
Run Code Online (Sandbox Code Playgroud)
和
案例2
b(j,i) .eq. a(i) !for all j, or even just j=1,2
Run Code Online (Sandbox Code Playgroud)
任意维度的奖励积分1:
b(i,j,k) .eq. a(i,j)
b(i,k,j) .eq. a(i,j)
Run Code Online (Sandbox Code Playgroud)
等等
1免责声明 - 我实际上没有SO超能力给回答者提供奖励积分;-)
我不确定你想要完成什么,但这里有几个可能有用的片段.
reshape
可以使用一个名为的可选参数,pad
它可以用来提供重构为一个元素所需的"额外"元素,这个元素的元素比你开始时多,比如从3x4到2x4x2.
您可能还对spread
为'upranking'数组设计的函数感兴趣,即采用rank-N数组并输出rank-N + 1数组.第二个副本中的片段可以重写为
array2d = spread(array1d,2,2)
Run Code Online (Sandbox Code Playgroud)
在此示例中,第二个参数是用于传播第一个参数以进行输出的维度.第三个参数是要进行的输入数组的副本数.
PS spread
或许应该是spread(array1d,1,2)
,我没有检查它.
编辑以回应OP对问题的编辑
通过分别在尺寸2和1上展开来满足两种情况1和2.在Fortran
b = spread(a,2,j)
Run Code Online (Sandbox Code Playgroud)
和
b = spread(a,1,j)
Run Code Online (Sandbox Code Playgroud)
由于spread
返回排名1大于其第一个参数的排名的数组,因此它提供了所寻求的任意维度.但是,因为显示排名3及以上的阵列非常耗费空间,所以我不会这么做.