によって通常返される対角線に直交する対角線に沿って反復する次のコードがありますnp.diagonal
。位置(0、0)から始まり、右下の座標に向かって進みます。
コードは意図したとおりに機能しますが、すべてのループがあまり複雑ではなく、トリックを実行するために多くの配列を作成する必要があるという点で非効率的です。
だから、これを行うためのより良い方法があるかどうか疑問に思います。なぜなら、配列をストライドする方法や、numpyの対角法を使用してより良い方法でそれを行う方法がわからないからです(失敗するトリックがいくつかあると思いますが)見る)。
import numpy as np
A = np.zeros((4,5))
#Construct a distance array of same size that uses (0, 0) as origo
#and evaluates distances along first and second dimensions slightly
#differently so that no values in the array is the same
D = np.zeros(A.shape)
for i in range(D.shape[0]):
for j in range(D.shape[1]):
D[i, j] = i * (1 + 1.0 / (grid_shape[0] + 1)) + j
print D
#[[ 0. 1. 2. 3. 4. ]
# [ 1.05882353 2.05882353 3.05882353 4.05882353 5.05882353]
# [ 2.11764706 3.11764706 4.11764706 5.11764706 6.11764706]
# [ 3.17647059 4.17647059 5.17647059 6.17647059 7.17647059]]
#Make a flat sorted copy
rD = D.ravel().copy()
rD.sort()
#Just to show how it works, assigning incrementing values
#iterating along the 'orthagonal' diagonals starting at (0, 0) position
for i, v in enumerate(rD):
A[D == v] = i
print A
#[[ 0 1 3 6 10]
# [ 2 4 7 11 14]
# [ 5 8 12 15 17]
# [ 9 13 16 18 19]]
編集
明確にするために、全体を要素ごとに繰り返しますA
が、上記のコードが呼び出す順序で繰り返します(これはfinalに表示されますprint
)。
反復が対角線に沿って進む方向(1と2が入れ替わった場合、および3と5などA
)は、対角線がAの主対角線(によって生成されたものnp.diag(A)
)に直交することだけが重要です。
この質問の適用/理由は、私の前の質問(その質問の下部にある解決策の部分)にあります:候補の潜在的に不完全なリストから2Dグリッドを構築する