首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试使用Numpy检查圆内的点

尝试使用Numpy检查圆内的点
EN

Stack Overflow用户
提问于 2019-04-04 09:54:17
回答 5查看 1.4K关注 0票数 1

我刚接触numpy,任务如下:我需要创建两个由随机整数组成的numpy数组(介于0+1之间)。一个numpy数组表示x坐标,另一个表示y坐标。然后,我需要使用squareroot(x^2 + y^2) < 1来检查这些点是否落入半径为1的圆内。

我现在只是尝试将我的数组平方并将它们相加在一起。这可能是一项非常简单的任务,却给我带来了无数的麻烦。

代码语言:javascript
复制
import matplotlib.pyplot as plt
import numpy as np

plots = 100

dataOne = np.random.random(size = plots)
dataTwo = np.random.random(size = plots)

circle = plt.Circle((0,0), 1, alpha = 0.1)
plt.gca().add_patch(circle)
plt.xlim(0, 5)
plt.ylim(0, 5)
plt.show()

squareDataOne = dataOne ** 2
squareDataTwo = dataTwo ** 2

if squareDataOne + squareDataTwo < 1:
    print("Now check square-root!")

我一直收到一条错误消息:包含多个元素的数组的真值不明确。使用a.any()或a.all()。有人能解释一下为什么Python/Numpy不喜欢这样吗?我被告知要尝试使用布尔表达式来对数组进行切片。有没有人能提供一些建议,让我把这一点融入到我给定的代码中?对新手的任何建议或提示都是非常感谢的。

EN

回答 5

Stack Overflow用户

发布于 2019-04-04 10:08:30

squareDataOne如下所示:

代码语言:javascript
复制
[7.43871942e-02 2.73007883e-01 5.23115388e-03 6.57541340e-01
 3.08779564e-01 1.24098667e-02 5.08258990e-01 6.52590269e-01
 8.90656103e-02 3.76389212e-02 2.12513661e-01 2.79683875e-01
 7.76233370e-01 6.48353342e-02 8.01663208e-01 8.69331480e-01
 4.34903542e]

squareData2看起来很像。if语句中的表达式:

代码语言:javascript
复制
squareDataOne + squareDataTwo < 1

生成以下数组:

代码语言:javascript
复制
[ True False  True  True  True  True  True  True False False  True False
  True False False  True  True  True  True  True False  True False False
  True  True False  True  True  True  True  True  True  True  True  True
  True  True False False  True False]

因此,您的if语句需要一个TrueFalse值,并获取此数组。错误消息告诉您,Python不知道如何将此数组转换为单个TrueFalse值。

我不能很好地理解你的代码逻辑,不知道你需要做什么来修复这个问题。显然,您有很多数据,但是您希望确定一个二进制事件;如果您应该输出"Now check square-root!“或者不是。我不知道你该怎么做。

票数 2
EN

Stack Overflow用户

发布于 2019-04-04 10:11:39

然后,我需要使用

(x^2+ y^2) < 1来检查这些点是否落在半径为1的圆内。

您可以使用array filtering

代码语言:javascript
复制
pt_norm = (squareDataOne + squareDataTwo)
r_inside_circle = np.sqrt(pt_norm[pt_norm < 1])

这将为您提供位于r_inside_circle中圆内的所有点的半径。当您增加值plots时,您将看到(4.0*len(r_inside_circle))/len(dataOne)将接近PI。

票数 0
EN

Stack Overflow用户

发布于 2019-04-04 10:51:03

我认为你想要替换这个:

代码语言:javascript
复制
if squareDataOne + squareDataTwo < 1:
    print("Now check square-root!")

使用类似这样的东西:

代码语言:javascript
复制
# Calculate radii
radii = (squareDataOne + squareDataTwo)**0.5

# Create a boolean array (True/False values) for filtering
incircle = radii < 1

# Print the number of points inside the circle (Python 3.6+ for the f-string)
print(f"There are {np.sum(incircle)} points inside the circle")

# Plot the points within the circle
plt.scatter(dataOne[incircle], dataTwo[incircle])

dataOne[incircle]dataTwo[incircle]将仅从incircle值为True的每个数组中提取那些元素(即x,y坐标对)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55506737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档