#python #numpy #angle #pi #radians
#python #numpy #угол #pi #радианы
Вопрос:
Я хочу выдать угол в радианах на python. Я также знаю, как это сделать, но возможно ли сделать вывод таким, как 1 * pi вместо 3.14159, не программируя его самостоятельно?
Спасибо за помощь.
Комментарии:
1. разделите на
pi
, и вы получите1
, а позже вам придется самостоятельно отображать его как1 * pi
— но3.14159
это всего лишь оксимация, чтобы вы могли получить1.1
или0.9
вместо1
. В конце концов, вы можете попробовать использовать модуль sympy для символьной математики2. также обратите внимание, что в numpy доступны некоторые константы (например, pi)
3. нет функции для преобразования
3.14159
в string1 * pi
и6.28318
as2*pi
, и вам придется делать это самостоятельно (путем divede bypi
). Проблема в том, чтоpi
это только приблизительно, и вы можете получить1.01 * pi
или0.99 * pi
вместо1 * pi
. Для некоторых углов вы можете просто использовать dictionary{30: "PI/6", 45: "PI/4", 60: "PI/3", ... 180: "PI", ...}
. Потому что вы должны использовать строки"PI/6"
,"PI/4"
,"PI/3"
так что вы даже можете использовать строкиπ/6, π/4, π/3
. ВИкипедия: Радиан имеет таблицу со значениями.4.Кстати: на основе радиана
radian = angle/180 * pi
Википедии, чтобы вы могли использовать его для отображения с помощью PI —print(angle/180, "* pi")
перед преобразованием вradian
Ответ №1:
Точно так же (см. комментарий Фураса) :
from math import pi
angle = 2*pi
angle_new_format = angle/pi
print("angle =", angle)
print("angle_new_format = {} * pi".format(angle_new_format))
Вывод :
angle = 6.283185307179586
angle_new_format = 2.0 * pi
Ответ №2:
Я написал эту функцию, которая найдет хорошую долю числа пи, используя Fraction.limit_denominator
, а затем очищает вывод, чтобы написать «пи» вместо «пи / 1» и «0» вместо «0,0 пи» и т.д.
from math import pi
from fractions import Fraction
def rad_to_pifrac(rad, max_denominator=8000):
pifrac = Fraction(rad / pi).limit_denominator(max_denominator)
if pifrac == 0:
return '0'
num = {1: '', -1: '-'}.get(pifrac.numerator, str(pifrac.numerator))
denom = '/{}'.format(pifrac.denominator) if pifrac.denominator != 1 else ''
return 'pi'.join((num, denom))
Играя с необязательным параметром max_denominator
, вы можете выбирать между более круглыми дробями или более точными дробями; например, rad_to_pifrac(22/7, max_denominator=1000)
is 'pi'
но rad_to_pifrac(22/7, max_denominator=2000)
is '2001pi/2000'
.
Некоторые тесты:
import sympy
def test_pi(max_denominator=100):
testcases = ['0', '1', '22/7', '0.39', '0.393', '3', '3.14', 'pi/8', 'pi/4', '-pi/4', '3*pi/4', '-3*pi/4', '-pi', 'pi', '2*pi', '6.28']
print('max_denominator={}'.format(max_denominator))
for s in testcases:
value = float(sympy.parse_expr(s).evalf())
pifrac = rad_to_pifrac(value, max_denominator=max_denominator)
print('{:10s} ----> {}'.format(s, pifrac))
>>> test_pi()
max_denominator=100
0 ----> 0
1 ----> 7pi/22
22/7 ----> pi
0.39 ----> 12pi/97
0.393 ----> pi/8
3 ----> 85pi/89
3.14 ----> pi
pi/8 ----> pi/8
pi/4 ----> pi/4
-pi/4 ----> -pi/4
3*pi/4 ----> 3pi/4
-3*pi/4 ----> -3pi/4
-pi ----> -pi
pi ----> pi
2*pi ----> 2pi
6.28 ----> 2pi