Python: 如何计算给定两个数组的多个 x 截距?
Python: How to compute multiple x intercept given two array?
我正在从事一个可视化数据的项目,但我遇到了一个关于找到多个 x 截距(可能是一个,可能至少是两个)的问题。
鉴于
x = np.array([ 3. , 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4. ,
4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5. , 5.1,
5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6. , 6.1, 6.2,
6.3, 6.4, 6.5, 6.6, 6.7, 6.8, 6.9, 7. , 7.1, 7.2, 7.3,
7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 8. , 8.1, 8.2, 8.3, 8.4,
8.5, 8.6, 8.7, 8.8, 8.9, 9. , 9.1, 9.2, 9.3, 9.4, 9.5,
9.6, 9.7, 9.8, 9.9, 10. , 10.1, 10.2, 10.3, 10.4, 10.5, 10.6,
10.7, 10.8, 10.9, 11. , 11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7,
11.8, 11.9, 12. , 12.1, 12.2, 12.3, 12.4, 12.5, 12.6, 12.7, 12.8,
12.9, 13. , 13.1, 13.2, 13.3, 13.4, 13.5, 13.6, 13.7, 13.8, 13.9,
14. , 14.1, 14.2, 14.3, 14.4, 14.5, 14.6, 14.7, 14.8, 14.9, 15. ,
15.1, 15.2, 15.3, 15.4, 15.5, 15.6, 15.7, 15.8, 15.9, 16. , 16.1,
16.2, 16.3, 16.4, 16.5, 16.6, 16.7, 16.8, 16.9, 17. , 17.1, 17.2,
17.3, 17.4, 17.5, 17.6, 17.7, 17.8, 17.9, 18. , 18.1, 18.2, 18.3,
18.4, 18.5, 18.6, 18.7, 18.8, 18.9, 19. , 19.1, 19.2, 19.3, 19.4,
19.5, 19.6, 19.7, 19.8, 19.9, 20. , 20.1, 20.2, 20.3, 20.4, 20.5,
20.6, 20.7, 20.8, 20.9, 21. , 21.1, 21.2, 21.3, 21.4, 21.5, 21.6,
21.7, 21.8, 21.9, 22. , 22.1, 22.2, 22.3, 22.4, 22.5, 22.6, 22.7,
22.8, 22.9, 23. , 23.1, 23.2, 23.3, 23.4, 23.5, 23.6, 23.7, 23.8,
23.9, 24. , 24.1, 24.2, 24.3, 24.4, 24.5, 24.6, 24.7, 24.8, 24.9,
25. , 25.1, 25.2, 25.3, 25.4, 25.5, 25.6, 25.7, 25.8, 25.9, 26. ,
26.1, 26.2, 26.3, 26.4, 26.5, 26.6, 26.7, 26.8, 26.9])
y = np.array([ 28250., 27750., 27250., 26750., 26250., 25750., 25250.,
24750., 24250., 23750., 23250., 22750., 22250., 21750.,
21250., 20750., 20250., 19750., 19250., 18750., 18250.,
17750., 17250., 16750., 16250., 15750., 15250., 14750.,
14250., 13750., 13250., 12750., 12250., 11750., 11250.,
10750., 10250., 9750., 9250., 8750., 8250., 7750.,
7250., 6750., 6250., 5750., 5250., 4750., 4250.,
3750., 3250., 2750., 2250., 1750., 1250., 750.,
250., -250., -750., -1250., -1750., -2250., -2750.,
-3250., -3750., -4250., -4750., -5250., -5750., -6250.,
-6750., -7250., -7750., -8250., -8750., -9250., -9750.,
-10250., -10750., -11250., -11750., -12250., -12750., -13250.,
-13750., -14250., -14750., -15250., -15750., -16250., -16750.,
-17250., -17750., -18250., -18750., -19250., -19750., -20250.,
-20750., -21250., -21750., -22250., -22750., -23250., -23750.,
-24250., -24750., -25250., -25750., -26250., -26750., -27250.,
-27750., -28250., -28750., -29250., -29750., -30250., -30750.,
-31250., -31750., -31250., -30750., -30250., -29750., -29250.,
-28750., -28250., -27750., -27250., -26750., -26250., -25750.,
-25250., -24750., -24250., -23750., -23250., -22750., -22250.,
-21750., -21250., -20750., -20250., -19750., -19250., -18750.,
-18250., -17750., -17250., -16750., -16250., -15750., -15250.,
-14750., -14250., -13750., -13250., -12750., -12250., -11750.,
-11250., -10750., -10250., -9750., -9250., -8750., -8250.,
-7750., -7250., -6750., -6250., -5750., -5250., -4750.,
-4250., -3750., -3250., -2750., -2250., -1750., -1250.,
-750., -250., 250., 750., 1250., 1750., 2250.,
2750., 3250., 3750., 4250., 4750., 5250., 5750.,
6250., 6750., 7250., 7750., 8250., 8750., 9250.,
9750., 10250., 10750., 11250., 11750., 12250., 12750.,
13250., 13750., 14250., 14750., 15250., 15750., 16250.,
16750., 17250., 17750., 18250., 18750., 19250., 19750.,
20250., 20750., 21250., 21750., 22250., 22750., 23250.,
23750., 24250., 24750., 25250., 25750., 26250., 26750.,
27250., 27750.])
概念是找x值,而对应的y值是0,你能帮我算一下吗?谢谢!
尝试np.where
coordinates_where_y_is_zero = np.where(y == 0)
print(coordinates_where_y_is_zero)
corresponding_x = x[coordinates_where_y_is_zero]
print(corresponding_x)
你的数据看起来像这样,你想得到 x 截距:
一个仅使用 numpy 的简单选项是在 y
更改符号时检查:
s = np.sign(y) # if you want to check the intercept with y=n
# use s = np.sign(y-n) instead
x[np.r_[s[:-1]!=s[1:], [False]]]
输出:
array([ 8.6, 21.3])
注意。这在这里工作得很好,因为你有一个很好的数据密度。如果不是这种情况,您可能希望在移位前后得到点并取均值:
s = np.sign(y)
mask = s[:-1]!=s[1:]
np.c_[x[np.r_[mask, [False]]], # point before
x[np.r_[[False], mask]], # point after
].mean(1)
# array([ 8.65, 21.35])
视觉输出:
我正在从事一个可视化数据的项目,但我遇到了一个关于找到多个 x 截距(可能是一个,可能至少是两个)的问题。
鉴于
x = np.array([ 3. , 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4. ,
4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5. , 5.1,
5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6. , 6.1, 6.2,
6.3, 6.4, 6.5, 6.6, 6.7, 6.8, 6.9, 7. , 7.1, 7.2, 7.3,
7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 8. , 8.1, 8.2, 8.3, 8.4,
8.5, 8.6, 8.7, 8.8, 8.9, 9. , 9.1, 9.2, 9.3, 9.4, 9.5,
9.6, 9.7, 9.8, 9.9, 10. , 10.1, 10.2, 10.3, 10.4, 10.5, 10.6,
10.7, 10.8, 10.9, 11. , 11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7,
11.8, 11.9, 12. , 12.1, 12.2, 12.3, 12.4, 12.5, 12.6, 12.7, 12.8,
12.9, 13. , 13.1, 13.2, 13.3, 13.4, 13.5, 13.6, 13.7, 13.8, 13.9,
14. , 14.1, 14.2, 14.3, 14.4, 14.5, 14.6, 14.7, 14.8, 14.9, 15. ,
15.1, 15.2, 15.3, 15.4, 15.5, 15.6, 15.7, 15.8, 15.9, 16. , 16.1,
16.2, 16.3, 16.4, 16.5, 16.6, 16.7, 16.8, 16.9, 17. , 17.1, 17.2,
17.3, 17.4, 17.5, 17.6, 17.7, 17.8, 17.9, 18. , 18.1, 18.2, 18.3,
18.4, 18.5, 18.6, 18.7, 18.8, 18.9, 19. , 19.1, 19.2, 19.3, 19.4,
19.5, 19.6, 19.7, 19.8, 19.9, 20. , 20.1, 20.2, 20.3, 20.4, 20.5,
20.6, 20.7, 20.8, 20.9, 21. , 21.1, 21.2, 21.3, 21.4, 21.5, 21.6,
21.7, 21.8, 21.9, 22. , 22.1, 22.2, 22.3, 22.4, 22.5, 22.6, 22.7,
22.8, 22.9, 23. , 23.1, 23.2, 23.3, 23.4, 23.5, 23.6, 23.7, 23.8,
23.9, 24. , 24.1, 24.2, 24.3, 24.4, 24.5, 24.6, 24.7, 24.8, 24.9,
25. , 25.1, 25.2, 25.3, 25.4, 25.5, 25.6, 25.7, 25.8, 25.9, 26. ,
26.1, 26.2, 26.3, 26.4, 26.5, 26.6, 26.7, 26.8, 26.9])
y = np.array([ 28250., 27750., 27250., 26750., 26250., 25750., 25250.,
24750., 24250., 23750., 23250., 22750., 22250., 21750.,
21250., 20750., 20250., 19750., 19250., 18750., 18250.,
17750., 17250., 16750., 16250., 15750., 15250., 14750.,
14250., 13750., 13250., 12750., 12250., 11750., 11250.,
10750., 10250., 9750., 9250., 8750., 8250., 7750.,
7250., 6750., 6250., 5750., 5250., 4750., 4250.,
3750., 3250., 2750., 2250., 1750., 1250., 750.,
250., -250., -750., -1250., -1750., -2250., -2750.,
-3250., -3750., -4250., -4750., -5250., -5750., -6250.,
-6750., -7250., -7750., -8250., -8750., -9250., -9750.,
-10250., -10750., -11250., -11750., -12250., -12750., -13250.,
-13750., -14250., -14750., -15250., -15750., -16250., -16750.,
-17250., -17750., -18250., -18750., -19250., -19750., -20250.,
-20750., -21250., -21750., -22250., -22750., -23250., -23750.,
-24250., -24750., -25250., -25750., -26250., -26750., -27250.,
-27750., -28250., -28750., -29250., -29750., -30250., -30750.,
-31250., -31750., -31250., -30750., -30250., -29750., -29250.,
-28750., -28250., -27750., -27250., -26750., -26250., -25750.,
-25250., -24750., -24250., -23750., -23250., -22750., -22250.,
-21750., -21250., -20750., -20250., -19750., -19250., -18750.,
-18250., -17750., -17250., -16750., -16250., -15750., -15250.,
-14750., -14250., -13750., -13250., -12750., -12250., -11750.,
-11250., -10750., -10250., -9750., -9250., -8750., -8250.,
-7750., -7250., -6750., -6250., -5750., -5250., -4750.,
-4250., -3750., -3250., -2750., -2250., -1750., -1250.,
-750., -250., 250., 750., 1250., 1750., 2250.,
2750., 3250., 3750., 4250., 4750., 5250., 5750.,
6250., 6750., 7250., 7750., 8250., 8750., 9250.,
9750., 10250., 10750., 11250., 11750., 12250., 12750.,
13250., 13750., 14250., 14750., 15250., 15750., 16250.,
16750., 17250., 17750., 18250., 18750., 19250., 19750.,
20250., 20750., 21250., 21750., 22250., 22750., 23250.,
23750., 24250., 24750., 25250., 25750., 26250., 26750.,
27250., 27750.])
概念是找x值,而对应的y值是0,你能帮我算一下吗?谢谢!
尝试np.where
coordinates_where_y_is_zero = np.where(y == 0)
print(coordinates_where_y_is_zero)
corresponding_x = x[coordinates_where_y_is_zero]
print(corresponding_x)
你的数据看起来像这样,你想得到 x 截距:
一个仅使用 numpy 的简单选项是在 y
更改符号时检查:
s = np.sign(y) # if you want to check the intercept with y=n
# use s = np.sign(y-n) instead
x[np.r_[s[:-1]!=s[1:], [False]]]
输出:
array([ 8.6, 21.3])
注意。这在这里工作得很好,因为你有一个很好的数据密度。如果不是这种情况,您可能希望在移位前后得到点并取均值:
s = np.sign(y)
mask = s[:-1]!=s[1:]
np.c_[x[np.r_[mask, [False]]], # point before
x[np.r_[[False], mask]], # point after
].mean(1)
# array([ 8.65, 21.35])
视觉输出: