問題: 10 x 10 のゼロの配列に 10 個の 1、20 個の 2、30 個の 3 をランダムに配置します。
実際に配列を使用する必要はありません。値が存在する位置の座標が必要なだけです。配列の観点から考えると簡単です。
私はこれに対していくつかの解決策を書きましたが、それらはすべて単純ではなく、pythonic ではないようです。誰かが私に洞察を与えてくれることを願っています。私の方法では、0〜99の線形配列を使用し、ランダムに(np.random.choice)10個の値を選択し、それらを配列から削除してから、20個のランダム値を選択しました。その後、線形位置を (y,x) 座標に変換します。
import numpy as np
dim = 10
grid = np.arange(dim**2)
n1 = 10
n2 = 20
n3 = 30
def populate(grid, n, dim):
pos = np.random.choice(grid, size=n, replace=False)
yx = np.zeros((n,2))
for i in xrange(n):
delPos = np.where(grid==pos[i])
grid = np.delete(grid, delPos)
yx[i,:] = [np.floor(pos[i]/dim), pos[i]%dim]
return(yx, grid)
pos1, grid = populate(grid, n1, dim)
pos2, grid = populate(grid, n2, dim)
pos3, grid = populate(grid, n3, dim)
おまけ 1 を入力するときに、それらすべてを「配列」の半分に配置したいとします。私の方法(グリッド[dim ** 2/2 :]からのサンプリング)を使用してそれを行うことができますが、他の提案で同じことを行う方法がわかりません。