在python中使用大型索引(numpy或列表)

时间:2017-10-31 13:53:52

标签: python numpy

我经常需要输入大整数来索引和创建numpy数组,例如3500000或250000.通常我会使用科学记数法,3.5e6或.25e6等输入这些数组。这样更快,更不容易出错。

不幸的是,python期望整数数据类型用于索引。显而易见的解决方案是转换数据类型。因此[5e5:1e6]变为[int(5e5):int(1e6)],但这会降低可读性并且输入时间会更长。更不用说,在listnumpy.ndarray上的索引操作失败之前,很容易忘记索引的数据类型。

有没有办法让numpy或python将大型浮点数解释为整数,还是有一种简单的方法可以在python中创建大整数?

6 个答案:

答案 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)],因此它没有我预期的那么有用。