7

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.]])

fortranで同じ効果を達成する方法はありますか? 配列が渡されることを期待するサブルーチンがあり2Dます。上で示したように、1 次元配列を 2 次元に「ブロードキャスト」したいと考えています。問題になる可能性が高いように思われるので、私の 2D 配列に明示的なインターフェイスがあります。

補足として、この機能は組み込みによって提供される可能性があると思いました--次のようなもの:reshape

real,dimension(3) :: arr1d
reshape(arr1d, (/3,3/), order=(/1,/1))

orderしかし、ドキュメントを読んだ後、1​​から「N」までのすべての数字を含める必要があるように見えるので、これは可能ではないと思います.

編集:もう少し明確にするために、入力に対して次のaような変換をいくつか作成する簡単な方法を探しています。

ケース1

b(i,j) .eq. a(i)  !for all j, or even just j=1,2

ケース 2

b(j,i) .eq. a(i)  !for all j, or even just j=1,2

任意の次元のボーナス ポイント1 :

b(i,j,k) .eq. a(i,j)
b(i,k,j) .eq. a(i,j)

1つの免責事項 - 私は実際には回答者にボーナスポイントを与えるほどのスーパーパワーを持っていません;-)

4

2 に答える 2

6

あなたが何を達成しようとしているのかはわかりませんが、役立つかもしれないいくつかの断片があります.

reshapeと呼ばれるオプションの引数を取ることがpadできます。これは、最初よりも多くの要素を持つ配列に再形成するときに必要な「余分な」要素を提供するために使用できます (3x4 から 2x4x2 など)。

spreadランク N の配列を取り込んでランク N+1 の配列を出力する、配列を「ランク付けする」ために設計された関数にも興味があるかもしれません。2 番目のコピーのフラグメントは、次のように書き換えることができます。

array2d = spread(array1d,2,2)

この例では、2 番目の引数は、出力を作成するために最初の引数を展開する次元です。3 番目の引数は、作成する入力配列のコピーの数です。

PS への呼び出しspreadはおそらく であるはずですがspread(array1d,1,2)、チェックしていません。

OPの質問の編集に応じて編集

1 と 2 の 2 つのケースは、それぞれ次元 2 と 1 に広がることによって満たされます。Fortran の場合

b = spread(a,2,j)

b = spread(a,1,j)

spread最初の引数のランクよりもランク 1 が大きい配列を返すため、求める任意の次元が提供されます。ただし、ランク 3 以上の配列を表示するのは非常にスペースを消費するため、ここでは説明しません。

于 2013-02-03T08:19:30.563 に答える
1

reshape 組み込み関数を使用すると、1D 配列を 2D 配列にコピーできます。十分に最近の Fortran コンパイラでは、それらはポインター手法です。ポインターは、ストレージを参照する 2 つ目の方法を提供し、コピーを回避します。その方法は「ポインタ境界リマッピング」です。例:

program array_tst

  integer, dimension (4), target :: array_1d
  integer, dimension (:,:), pointer :: array_2d

  array_1d = [ 1, 2, 3, 4 ]

  array_2d (1:2, 1:2) => array_1d

  write (*, *) array_2d (1,1), array_2d (1,2), array_2d (2,1), array_2d (2,2)

end program array_tst

Fortran での配列の次元の変更も参照してください。

PSコメントへの返信...配列をコピーしてもかまわない場合は、reshapeの使用方法を次に示します。

program array_reshape

  integer, dimension (4) :: array_1d
  integer, dimension (2, 2) :: array_2d

  array_1d = [ 1, 2, 3, 4 ]

  array_2d = reshape ( array_1d, [2,2] )

  write (*, *) array_2d (1,1), array_2d (1,2), array_2d (2,1), array_2d (2,2)

end program array_reshape
于 2013-02-03T03:09:38.127 に答える