Python 使用可变密度放置点

Python 使用可变密度放置点,python,algorithm,radial-gradients,Python,Algorithm,Radial Gradients,假设您有一个NxM矩阵,其值范围为[0100]。我想做的是放置点,点的密度(与该区域的值成反比) 例如,这是一个二维高斯场,倒置的s.t。质心的值为0,周长为100: 我想对这些点进行打包,使它们看起来有点类似于此图: 注意有一个向外的径向扩展 我的尝试看起来有点不同:( 我试图做的是(I)生成一个形状和大小相同的布尔区域,以及(ii)在行和列之间移动。如果布尔数组在某个点的值为True,则通过;否则,添加一个[行,列]指向一个列表,用True覆盖布尔数组,半径与高斯数组中的值成比例 在这

假设您有一个
NxM
矩阵,其值范围为[0100]。我想做的是放置点,点的密度(与该区域的值成反比)

例如,这是一个二维高斯场,倒置的s.t。质心的值为0,周长为100:

我想对这些点进行打包,使它们看起来有点类似于此图:

注意有一个向外的径向扩展

我的尝试看起来有点不同:(

我试图做的是(I)生成一个形状和大小相同的布尔区域,以及(ii)在行和列之间移动。如果布尔数组在某个点的值为
True
,则通过;否则,添加一个
[行,列]
指向一个列表,用
True
覆盖布尔数组,半径与高斯数组中的值成比例

在这个例子中选择高斯并不重要,其基本思想是:给定一个浮点矩阵,如何放置密度与这些值成比例的点

非常感谢您的帮助:)

导入matplotlib.pyplot作为plt
将numpy作为np导入
从数学导入exp
def高斯(x,y,x0,y0,A=10.0,sigma_x=10.0,sigma_y=10.0):
返回A-A*exp(((x-x0)**2/(2*sigma\ux**2)+(y-y0)**2/(2*sigma\uy**2)))
def生成网格(宽度=100,高度=100):
网格=np.空((宽度、高度))
对于范围内的x(0,宽度):
对于范围(0,高度)内的y:
网格[x][y]=高斯分布(x,y,宽度/2,高度/2,A=100.0)
回流栅
def覆盖阵列(a、行、列、半径):
nRows=np.形状(网格)[0]
nCols=np.形状(网格)[1]
中间=圆形(半径/2)
半圆形半径=整数(圆形(半径))
对于范围内的x(-half_半径,half_半径):
对于范围内的y(-half_半径,half_半径):
如果行+x>=0和行+x=0和列+y=nCols:
行+=1
col=0
网格=生成网格()
plt.imshow(网格)
plt.show()
点=打包点(网格)
plt.散射(点[:,0],点[:,1])
plt.show()

这是一种便宜而简单的方法,尽管它需要手动设置
金额
参数:

import numpy as np
import matplotlib.pyplot as plt

def gaussian(x,y,x0,y0,A=10.0,sigma_x=10.0,sigma_y=10.0):
    return A - A*np.exp(-((x-x0)**2/(2*sigma_x**2) + (y-y0)**2/(2*sigma_y**2)))

def distribute_points(data, amount=1):
    p = amount * (1 / data)
    r = np.random.random(p.shape)
    return np.where(p > r)

ii, jj = np.mgrid[-10:10:.1, -10:10:.1]
data = gaussian(ii, jj, 0, 0)
px, py = distribute_points(data, amount=.03)

plt.imshow(data)
plt.scatter(px, py, marker='.', c='#ff000080')
plt.xticks([])
plt.yticks([])
plt.xlim([0, len(ii)])
plt.ylim([0, len(jj)])
结果:


这些点是否需要以某种方式“对齐”,或者如果它们是随机放置的,但具有足够的密度,这可以吗?@jdehesa只有密度很重要。谢谢首先,将所有点的密度按任意顺序相加,计算第i个点的相应间隔(sumOfDensitiesUpToPoint[i-1],sumOfDensitiesUpToPoint[i])。现在选择一个介于0和总和之间的随机数,找出它所处的区间,这将告诉您此示例的位置。必要时重复。(您可能希望记录已采样的点并重复它们)。您可以通过二进制搜索加快查找间隔的速度。
import numpy as np
import matplotlib.pyplot as plt

def gaussian(x,y,x0,y0,A=10.0,sigma_x=10.0,sigma_y=10.0):
    return A - A*np.exp(-((x-x0)**2/(2*sigma_x**2) + (y-y0)**2/(2*sigma_y**2)))

def distribute_points(data, amount=1):
    p = amount * (1 / data)
    r = np.random.random(p.shape)
    return np.where(p > r)

ii, jj = np.mgrid[-10:10:.1, -10:10:.1]
data = gaussian(ii, jj, 0, 0)
px, py = distribute_points(data, amount=.03)

plt.imshow(data)
plt.scatter(px, py, marker='.', c='#ff000080')
plt.xticks([])
plt.yticks([])
plt.xlim([0, len(ii)])
plt.ylim([0, len(jj)])