我正在用Python复制一些R代码。
我绊倒了R pretty()
。
我需要的只是pretty(x)
,其中x
是一些数字。
粗略地说,函数“计算漂亮的断点”作为几个“圆”值的序列。我不确定是否有Python等价物,而且我对Google没有太多运气。
编辑:更具体地说,这是pretty
的帮助页面中的描述条目:
描述:计算大约n + 1个等间距'圆'值的序列,它覆盖x中值的范围。选择这些值使它们是10的幂的1,2或5倍。
我查看了R的pretty.default()
,看看R究竟在做什么,但最终使用了.Internal()
- 这通常会导致黑暗的R魔法。我以为在潜入之前我会问过。
有没有人知道Python是否具有与R pretty()
相当的东西?
答案 0 :(得分:7)
我认为Lewis Fogden发布的伪代码看起来很熟悉,我们确实曾用C ++编写伪代码用于绘图例程(确定漂亮的轴标签)。我很快将它翻译成Python,不确定它是否与R中的pretty()
类似,但我希望它对任何人都有帮助或有用..
import numpy as np
def nicenumber(x, round):
exp = np.floor(np.log10(x))
f = x / 10**exp
if round:
if f < 1.5:
nf = 1.
elif f < 3.:
nf = 2.
elif f < 7.:
nf = 5.
else:
nf = 10.
else:
if f <= 1.:
nf = 1.
elif f <= 2.:
nf = 2.
elif f <= 5.:
nf = 5.
else:
nf = 10.
return nf * 10.**exp
def pretty(low, high, n):
range = nicenumber(high - low, False)
d = nicenumber(range / (n-1), True)
miny = np.floor(low / d) * d
maxy = np.ceil (high / d) * d
return np.arange(miny, maxy+0.5*d, d)
这会产生例如:
pretty(0.5, 2.56, 10)
pretty(0.5, 25.6, 10)
pretty(0.5, 256, 10 )
pretty(0.5, 2560, 10)
[0.5 1. 1.5 2. 2.5 3.]
[0. 5. 10. 15. 20. 25. 30。]
[0. 50. 100. 150. 200. 250. 300。]
[0。500. 1000. 1500. 2000. 2500. 3000。]
答案 1 :(得分:2)
它不像 R 那样优雅,但你仍然可以使用numpy:
import numpy as np
np.linspace(a,b,n,dtype=int)
其中a
是范围的开头,b
是结束,n
是值的数量,而输出类型是int
。
例如:
np.linspace(0,10,11,dtype=int)
数组([0,1,2,3,4,5,6,7,8,9,10])
当然,如果你想要它更优雅,你可以包装它:
pretty = lambda x: np.linspace(0,x,11,dtype=int)
pretty(10)
答案 2 :(得分:0)
numpy.arange怎么样?
import numpy as np
print np.arange(0,16,3)
$ [0 3 6 9 12 15]