我试图在R^n
,其中n
未知的情况下实现网格搜索(在Python中,如果它很重要)。在R^n中的立方体/球体网格搜索
输入包括球体的半径和中心,以及控制网格分辨率的超参数theta
。我想根据这三个参数来表示这个球体中的每个点。
我也愿意考虑立方体搜索,只迭代立方体的面。 (即,迭代L_inf
sphere)
如果我知道,N = 2,我会做的是:
import numpy as np
def enumerate_2d_sphere(R,theta,center=(0,0)):
for n in xrange(int(2*np.pi/theta)+1):
degree = n*theta
point =(center[0]+R*np.cos(degree),center[1]+R*np.sin(degree))
yield point
for p in enumerate_2d_sphere(1,0.1):
print p
由于n
可以任意大,我正在寻找一种方式来遍历球\立方体有效。
任何想法?
++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++
最后我用的是什么strubbly建议修改后的版本:
import itertools
import numpy as np
import matplotlib.pyplot as plt
def f(d, center, scale=1):
dim = len(center)
print d/-2.0
diff = scale * np.array([d/-2.0 for _ in xrange(dim)])
bias = diff + center
for i in range(dim):
l = ([ xrange(1,d) for _ in xrange(i)] +
[[0,d]] +
[ xrange(d+1) for _ in xrange(dim-i-1)]
)
for r in itertools.product(*l):
yield scale*np.array(r)+bias
#example for R^2:
center = (1,1.5)
data = np.array([x for x in f(20,center,scale = 0.1)])
plt.scatter(data[:,0], data[:,1],color='r',s=100,alpha=0.5)
plt.scatter(center[0], center[1],color='b',s=300,alpha=0.5)
plt.show()
输出数字:
另外一个选项是生成 uniformly distributed samples on the sphere。需要注意的是样本的数目控制点的“密度”(或预期密度):
import numpy as np
def generate_random_points(R,center,quantity=1000):
"""
:param R: float
:param center: np.array
:param quantity: int
"""
dim = len(center)
for n in xrange(quantity):
s = np.random.normal(0, 1,dim)
r = np.sqrt(np.dot(s,s))
s = (R/r) * s
yield s+center
最坏方法(在简单和效率的方面)。将生成上使用enumeration of n-1 angles球体点。由于需要计算产品sin
和cos
(虽然也可能会被黑客攻击),所以效率不高。
你能多解释一下你想要的吗?例如,假设R = 10,n = 2,c =(0,0),θ= 1。作为R,c和theta的函数,代表这个磁盘中的所有点是什么意思? –
我添加了一个例子 – omerbp