我经常需要输入大整数来索引和创建numpy数组,例如3500000或250000。通常,我会使用科学符号3.5e6或.25e6之类的方式输入这些内容。这样做更快,也更不可能出现错误。
不幸的是,python需要整数数据类型来进行索引。显而易见的解决方案是转换数据类型。因此,[5e5:1e6]变成了[int(5e5):int(1e6)],但是这降低了可读性,并且要输入的时间要长一些。更不用说,在索引操作在list或numpy.ndarray上失败之前,很容易忘记索引的数据类型。
是否有一种让numpy或python将大浮点数解释为整数的方法,还是在python中创建大整数的简单方法?
发布于 2017-10-31 14:28:26
在一条评论中,您考虑让e5 = 10**5像在35*e5中一样使用,遗憾的是它不支持3.5*e6。这里有一个黑客可以做到:
class E:
def __init__(self, e):
self.val = 10**e
def __rmul__(self, x):
return int(x * self.val)演示:
>>> e6 = E(6)
>>> 3.5*e6
3500000虽然由于浮标是有损耗的,但这可能会导致轻微的不准确,例如:
>>> 0.1251*e6
125099下面是一个更好的方法,构建文字'0.1251e6'并对其进行评估:
class E:
def __init__(self, e):
self.e = e
def __rmul__(self, x):
return int(float('%se%d' % (x, self.e)))演示:
>>> e6 = E(6)
>>> 0.1251*e6
125100发布于 2017-10-31 14:05:15
如果您担心零位数的错误,请尝试下划线。
>>> 3_500_000
3500000发布于 2017-10-31 14:34:13
我的廉价解决方案是在适当的范围内创建一个助手函数。
def e(coeff, exponent):
return int (coeff * 10 ** exponent)
np_array[e(3.5,6)] # use like this但是这个更便宜的答案可能会导致舍入错误,在适当的范围内为int创建别名是简单而干净的解决方案。
e=int # in proper scopehttps://stackoverflow.com/questions/47037150
复制相似问题