J'essaie d'implémenter une recherche de grille (en Python, si c'est important) sur une sphère dans R^n
, où n
est inconnue.Recherche de grille sur un cube/sphère dans R^n
L'entrée inclut le rayon et le centre de la sphère, ainsi qu'un hyperparamètre theta
, qui contrôle la résolution de la grille. Je voudrais exprimer chaque point dans cette sphère en fonction de ces trois paramètres.
Je suis également prêt à considérer la recherche de cube, en répétant SEULEMENT les faces du cube. (à savoir, itérer le L_inf
sphere)
Si je savais que n = 2, ce que je ferais est:
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
Depuis n
peut être arbitrairement grand, je suis à la recherche d'un moyen de parcourir la sphère \ cube efficacement.
Des idées?
++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++
Je fini par utiliser une version modifiée de ce qui a suggéré 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()
La figure de sortie:
Une option de plus, est de générer uniformly distributed samples on the sphere. Notez que le nombre d'échantillons contrôle la « densité » (ou densité attendue) des points:
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
La pire méthode (en termes de simplicité et d'efficacité) serait de générer des points sur la sphère en utilisant enumeration of n-1 angles. Le manque d'efficacité découle du besoin de calculer les produits sin
et cos
souvent (même si cela peut être piraté aussi)
Pouvez-vous expliquer un peu plus ce que vous voulez? Par exemple, supposons que R = 10, n = 2, c = (0, 0), thêta = 1. Que signifie représenter tous les points de ce disque en fonction de R, c et thêta? –
J'ai ajouté un exemple – omerbp