我经常需要输入大整数来索引和创建numpy数组,例如3500000或250000.通常我会使用科学记数法,3.5e6或.25e6等输入这些数组。这样更快,更不容易出错。
不幸的是,python期望整数数据类型用于索引。显而易见的解决方案是转换数据类型。因此[5e5:1e6]
变为[int(5e5):int(1e6)]
,但这会降低可读性并且输入时间会更长。更不用说,在list
或numpy.ndarray
上的索引操作失败之前,很容易忘记索引的数据类型。
有没有办法让numpy
或python将大型浮点数解释为整数,还是有一种简单的方法可以在python中创建大整数?
答案 0 :(得分:2)
如果你担心零数的错误,请尝试下划线。
>>> 3_500_000
3500000
答案 1 :(得分:2)
在评论中,您考虑将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
答案 2 :(得分:2)
我的廉价解决方案是在适当的范围内创建辅助函数。
def e(coeff, exponent):
return int (coeff * 10 ** exponent)
np_array[e(3.5,6)] # use like this
但是这个更便宜的答案可能会导致出现错误, 在适当的范围内为int创建别名是简单而干净的解决方案。
e=int # in proper scope
答案 3 :(得分:1)
我可以建议使用这样的符号[5*10**5:1*10**6]
,但它不像5e5和1e6那样清晰。在3.5e6 = 35*10**5
答案 4 :(得分:0)
您可以为int()
添加较短的名称,例如I
I = int
x = I(3.5e6)
print (x)
#3500000
这仍然允许正常使用int()
答案 5 :(得分:0)
这应解决索引列表和带浮点数的数组的问题,
slice_orig = slice
def slice(*args):
return slice_orig(*[int(i) for i in args])
slice.__doc__ = slice_orig.__doc__+ """
WARNING: overridden to convert (stop, start, step) to integers"""
不允许对需要numpy
类型的其他int
函数使用大数字。
编辑:必须明确使用,例如list[slice(1e5)]
,因此它没有我预期的那么有用。