2017-03-16 4 views
1

Je suis une nouvelle programmation utilisateur en python qui a besoin d'aide pour compléter un exercice. avant de générer 2000 nombres aléatoires entre -10 et 10 pour x et y, je dois m'assurer que les x et y qui ne remplissent pas ces deux conditions sont sortis: np.sqrt (x^2 + y^2) et lorsque les valeurs absolues pour x et y sont> 5. comment puis-je insérer ces deux conditions sur l'intrigue?Scatter des nombres aléatoires avec deux conditions (l'intrigue ressemblera à un cercle flou avec un trou carré à l'intérieur)

conditions:

np.sqrt(x**2 + y**2) < 10 
abs(x),abs(y) > 5 

je commence comme ceci:

import numpy as np 
import matplotlib.pyplot as plt 
N=2000 
x = np.random.uniform(-10,10,N) 
y = np.random.uniform(-10,10,N) 

a = np.zeros(np.size(x), dtype=bool) 
b = np.sqrt(x**2+y**2) 

for i in range(np.size(x)): 
    if (b[i] < 10): 
     a[i] = True 
x = x[a] 
y = y[a] 

plt.plot(x,y, "b o") 
plt.show() 

merci beaucoup à l'avance!

c'est le code modifié ci-dessus, mais je suis encore besoin de remplir la condition où x et y est supérieur à 5 et -5

+0

Comment ces deux exigences peuvent tenir ensemble? si abs (x) et abs (y) sont plus grands que 5, alors np.square (x ** 2 + y ** 2)> 10. –

+0

je pense que pour x et y qui sont dans la gamme de -5 et 5 et qui satisfait le np.sqrt (x2 + y2) je voulais trouver une solution en utilisant le numpy comme np. Je pense que ce n'est pas si difficile mais j'ai du mal à mettre en place ces conditions ... – Jan

Répondre

0
import numpy as np 
import matplotlib.pyplot as plt 
N=2000 
x = np.random.uniform(-10,10,N) 
y = np.random.uniform(-10,10,N) 

a = np.zeros(np.size(x), dtype=bool) 
b = np.sqrt(x**2+y**2) 

for i in range(np.size(x)): 
    if (max(abs(x[i]), abs(y[i]))>5) & (b[i] < 10): 
     a[i] = True 
    else: 
     a[i] = False 
x = x[a] 
y = y[a] 

plt.plot(x,y, "b o") 
plt.show() 

should look like this!!!

Merci toutes les personnes ! J'ai trouvé l'erreur

0

pseudo-code serait

var maxpoints = 2000 
var ptx[maxpoints] 
var pty[maxpoints] 

for (num = 0; num < maxpoints; num++) { # 

    do { 

     trialx = np.random.uniform(-10,10,N) # create a new x 
     trialy = np.random.uniform(-10,10,N) # create a new y 

    } while (! ((math.sqrt(trialx**2 + trialy**2) < 10) && 
       (math.abs(trialx) > 5 && math.abs(trialy) > 5))) 

    ptx[num] = trialx   
    pty[num] = trialy 

} 

continuent essentiellement l'intérieur en boucle jusqu'à ce que vous découvriez le prochain x et y qui satisfait vos restrictions ... les restrictions sur la création d'un cercle feraient naturellement une racine carrée (x^2 + y^2) et non carrées (x^2 + y^2) ... @Jan s'il vous plaît clarifier cela et mettre à jour votre question

mise à jour je me suis enseigné quelques python à traduire ci-dessus dans le code de travail avec une image

from array import array 
import numpy as np 
import matplotlib.pyplot as plt 

circle_radius = 10 

maxpoints = 2000 
ptx = np.zeros(maxpoints) 
pty = np.zeros(maxpoints) 

seedval = circle_radius + 1 

for num in range(0,maxpoints): 

    trialx = seedval 
    trialy = seedval 

    while (not (((np.sqrt(trialx*trialx + trialy*trialy) < circle_radius)) and 
       (np.abs(trialx) > 5 and np.abs(trialy) > 5))) : 

     trialx = np.random.uniform(-circle_radius,circle_radius) # create a new x 
     trialy = np.random.uniform(-circle_radius,circle_radius) # create a new y 

     print "current trial ", trialx, trialy 

    ptx[num] = trialx   
    pty[num] = trialy 

    print num, trialx, trialy 


plt.plot(ptx, pty, 'ro') 
plt.show() 

donc ci-dessus va générer ce complot

+0

merci Scott, mais ce code n'a pas fonctionné sur le mien. et je ne suis pas familier avec var et trial x et y ... – Jan

+0

son pseudo-code qui vous donne l'essence ... il suffit de prendre cette approche et tourner un peu python –

+0

Oui, je voulais dire racine carrée. c'était probablement une de mes erreurs Tu es l'homme! – Jan