Python 像素网格中非相邻单元的随机采样

Python 像素网格中非相邻单元的随机采样,python,numpy,random-sample,Python,Numpy,Random Sample,假设我们有一个n*n网格。我们想选择k,这里有一个简单的拒绝采样实现。可能有一种比query\u 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 co

假设我们有一个
n*n
网格。我们想选择
k,这里有一个简单的拒绝采样实现。可能有一种比
query\u 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')

我看到,这已经是一个公认的答案,但这是一项具有挑战性的任务,所以我解决了以下问题,我很喜欢,因此我对这个问题投了一个赞成票:):

输出:

(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.]]
它总是提供非相邻单元的随机组合。
享受吧!:)

您希望从哪个分布中提取?您是否希望从由所有非相邻像素的k元组组成的空间中获得统一的样本,因为这类组合采样问题可能非常困难(例如,具有固定行和列和的采样矩阵),即使乍看起来很容易。@F先生,我正在寻找统一的样本。我不是在寻找所有的k元组。只要一个非相邻像素的k元组就可以了。如果网格中的单元格非常稀疏,那么我只需要进行拒绝采样。通过均匀采样生成一些候选点,然后检查其中是否有相邻点,重复此操作直到找到一组有效点。您可以对稀疏数据(即点坐标)执行此检查,而不是检查完整的n*n网格。但在绘制时,您必须描述所有此类k元组的空间(尽管在这种情况下,一次顺序采样一个像素,然后消除其边界可能最终产生统一的k元组)。我也在考虑这个顺序采样。这是我的第一个选择。同时,我想知道是否有更有效的方法来实现这一点。您的拒绝采样算法似乎不起作用。我认为可能
valid=len(kdtree(coords)。query_pairs(1.0))==0
不符合此处的要求。请尝试查询(10)
或其他大于1的数字…您会看到它不会产生期望的结果。感谢您指出这一点。问题是数据应该被转置:
kdtree
将输入视为两个50维数据点。我已更新了代码。
(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.]]