像素网格中非相邻单元的随机采样
Random sampling of non-adjacent cells in a pixel grid
假设我们有一个 n*n
网格。我们想选择此网格中不相邻的 k << n
个随机单元格。如果我们用包含 0
和 1
的 2D Numpy 数组模拟此网格,在 Numpy/Python 中最有效的方法是什么?
有效示例:
无效示例:
下面是拒绝抽样的简单实现。可能有比 query_pairs
更快的方法来进行邻接检查(在这种情况下也会检查碰撞),因为您只想测试在此距离阈值内是否至少有一对。
import numpy as np
from scipy.spatial import cKDTree as kdtree
n = 100
k = 50
valid = False
while not valid:
# generate k grid indices
coords_flat = np.random.random_integers(0, n ** 2 - 1, size=k)
coords = np.unravel_index(coords_flat, dims=(n, n))
# test there are no adjacent cells
transposed = np.transpose(coords)
valid = len(kdtree(transposed).query_pairs(1.0)) == 0
print(coords)
看看结果:
import matplotlib.pyplot as plt
grid = np.zeros((n, n), dtype=np.bool)
grid[coords] = True
plt.imshow(grid)
plt.savefig('result.png')
我看到,这已经是一个可以接受的答案,但这是一项具有挑战性的任务,所以我解决了如下问题并且我很喜欢它,因此我给了 upvote问题 :):
import numpy as np
xy = []
x = np.random.randint(0,5)
y = np.random.randint(0,5)
xy.append((x,y))
while True:
x = np.random.randint(0,5)
y = np.random.randint(0,5)
for ii,i in enumerate(xy):
if x in [i[0]-1, i[0], i[0]+1]:
if x == i[0]:
if y in [i[1]-1, i[1], i[1]+1]:
break
else:
if ii == len(xy) - 1:
xy.append((x,y))
break
elif y == i[1]:
break
elif ii == len(xy) - 1:
xy.append((x,y))
break
if len(xy) == 3:
break
for cords in xy:
print cords
sq =np.zeros((5,5))
for cords in xy:
sq[cords] = 1
print sq
输出:
(1, 0)
(4, 4)
(4, 1)
[[ 0. 0. 0. 0. 0.]
[ 1. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]
[ 0. 1. 0. 0. 1.]]
它始终提供非相邻单元格的随机组合。
好好享受! :)
假设我们有一个 n*n
网格。我们想选择此网格中不相邻的 k << n
个随机单元格。如果我们用包含 0
和 1
的 2D Numpy 数组模拟此网格,在 Numpy/Python 中最有效的方法是什么?
有效示例:
无效示例:
下面是拒绝抽样的简单实现。可能有比 query_pairs
更快的方法来进行邻接检查(在这种情况下也会检查碰撞),因为您只想测试在此距离阈值内是否至少有一对。
import numpy as np
from scipy.spatial import cKDTree as kdtree
n = 100
k = 50
valid = False
while not valid:
# generate k grid indices
coords_flat = np.random.random_integers(0, n ** 2 - 1, size=k)
coords = np.unravel_index(coords_flat, dims=(n, n))
# test there are no adjacent cells
transposed = np.transpose(coords)
valid = len(kdtree(transposed).query_pairs(1.0)) == 0
print(coords)
看看结果:
import matplotlib.pyplot as plt
grid = np.zeros((n, n), dtype=np.bool)
grid[coords] = True
plt.imshow(grid)
plt.savefig('result.png')
我看到,这已经是一个可以接受的答案,但这是一项具有挑战性的任务,所以我解决了如下问题并且我很喜欢它,因此我给了 upvote问题 :):
import numpy as np
xy = []
x = np.random.randint(0,5)
y = np.random.randint(0,5)
xy.append((x,y))
while True:
x = np.random.randint(0,5)
y = np.random.randint(0,5)
for ii,i in enumerate(xy):
if x in [i[0]-1, i[0], i[0]+1]:
if x == i[0]:
if y in [i[1]-1, i[1], i[1]+1]:
break
else:
if ii == len(xy) - 1:
xy.append((x,y))
break
elif y == i[1]:
break
elif ii == len(xy) - 1:
xy.append((x,y))
break
if len(xy) == 3:
break
for cords in xy:
print cords
sq =np.zeros((5,5))
for cords in xy:
sq[cords] = 1
print sq
输出:
(1, 0)
(4, 4)
(4, 1)
[[ 0. 0. 0. 0. 0.]
[ 1. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]
[ 0. 1. 0. 0. 1.]]
它始终提供非相邻单元格的随机组合。 好好享受! :)