【问题标题】:Python/Numpy if statement syntaxPython/Numpy if 语句语法
【发布时间】:2017-02-05 19:17:56
【问题描述】:

我有这个 if 语句来检查 (x,y) 随机生成的坐标是否在圆内,如果是,它会增加一个计数器来计算圆内实际有多少点。 我有这个:

    x = numpy.random.uniform(-1, 1, num)
    y = numpy.random.uniform(-1, 1, num)

    if(numpy.all((x**2 + y**2) < 1)):
      c+=1

我没有收到任何错误,但 if 语句不起作用,即使我确定存在使 if 语句为真的坐标。我的语法在这里正确吗?

提前致谢!

编辑:我刚刚意识到我需要遍历每个元素的 x 和 y 数组,抱歉不清楚!

【问题讨论】:

  • 什么是 x 和 y? numpy 数组?如果它们是 numpy 数组,很确定你需要 (x ** 2 + y ** 2 &lt; 1).sum()
  • 如果您的程序存在运行时错误,则程序的语法无关紧要。您应该打印出 xy 的值,看看它们的值是否符合您的预期。
  • 您的描述应该是:检查所有 (x,y) 坐标是否在圆内。您确定要使用.all 而不是.any
  • x**2 + y**2 的输出是什么?
  • 你确定 x 和 y 不是数字数组吗?这可以解释你的 if “不起作用”,因为如果数组很大,它们描述的所有点都不太可能位于圆内。您是否有机会尝试计算 pi?然后(如果这些是数组)您不需要 if 语句,而只需要 c+=((x**2 + y**2) &lt; 1).sum() 这会计算有多少坐标对描述了圆内的一个点。

标签: python python-2.7 numpy if-statement


【解决方案1】:

您可以使用 numpy 的矢量化方法执行相同但更快的操作:

X = np.array([random.uniform(-1,1) for i in range(5)])
Y = np.array([random.uniform(-1,1) for i in range(5)])

# Return Indexes where the statement is true:
L = np.where((X**2 + Y**2) < 1)

print X
print Y
print L

>>>
[-0.91212004  0.65893078 -0.25020712 -0.21768537 -0.99964874]
[-0.06871978 -0.60834897  0.11997134  0.2721608   0.77688788]
(array([0, 1, 2, 3], dtype=int64),) 

要返回发生这种情况的次数,只需执行以下操作:

c = len(np.where((X**2 + Y**2) < 1)[0])
c = 4

然后您可以通过以下方式访问发生这种情况的元素:

X_new = np.delete(X,np.where((X**2 + Y**2) < 1)[0],0)
Y_new = np.delete(Y,np.where((X**2 + Y**2) < 1)[0],0)

print X_new
print Y_new

>>>
[-0.91212004  0.65893078 -0.25020712 -0.21768537]
[-0.06871978 -0.60834897  0.11997134  0.2721608]

原答案:

如果您在radius = 1 时检查这些点是否位于半径内,那么您可以这样做:

X = 0.5
Y = 0.5
c=0
if (X**2 + Y**2) < 1:
    print "Success"
    c+=1

在这种情况下,c 只是一个计数器,用于计算这是真的次数。如果数组中有多个点,您可以这样做:

X = [0.5,0.6,0.7]
Y = [0.2,0.3,0.4]
c=0
for x, y in zip(X,Y):
    if (x**2 + y**2) < 1:
        print "Success"
        c+=1

对于随机数:

import random
X = random.uniform(-1, 1)
Y = random.uniform(-1, 1)
c=0
if (X**2 + Y**2) < 1:
    print "Success"
    c+=1

并生成随机数列表:

import random
X = []
Y = []
for i in range(10):
    X.append(random.uniform(-1, 1))
    Y.append(random.uniform(-1, 1))
c=0
for i,j in zip(X,Y):
    if (i**2 + j**2) < 1:
        print "Yes"
        c+=1
    else:
        print "No"

【讨论】:

    【解决方案2】:

    如果你想知道num中有多少点在单位圆内,并且想坚持NumPy(这是个好主意),试试这个:

    c = ((x**2 + y**2) < 1).sum()
    

    【讨论】:

      【解决方案3】:

      这个问题很模糊,如果您添加更多代码会有所帮助,以便我们更好地理解您的问题。

      但是当你说你没有收到错误,并且语句不起作用时......那么可能是你没有对语句做任何事情,例如给它一个 print() 函数。

      例如

      import numpy
      
      x = 0.2
      y = 0.2
      c = 0
      if(numpy.all((x**2 + y**2) < 1)):
          c+=1
          print(c)
      
      else:
          print("incorrect")
      

      抱歉,如果我误解了您的问题。

      【讨论】:

        【解决方案4】:
        if(numpy.all((x**2 + y**2) < 1)):
        

        这里不需要最外层的括号,使用

        if numpy.all((x**2 + y**2) < 1):
        

        改为。

        【讨论】:

        • 没什么区别。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-05
        • 2012-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多