Python:自动选择适当的数据类型大小(int)

时间:2011-12-19 04:30:13

标签: python numpy

我正在用Python和numpy分配一个(可能很大的)零矩阵。我计划将无符号整数从1添加到N

N变化很大:很容易从1一直到100万,甚至更多。

在矩阵初始化之前我知道N。如何选择矩阵的数据类型,以便我知道它可以保存大小为N的(无符号)整数?

此外,我想选择最小这样的数据类型。

例如,如果N为1000,我会选择np.dtype('uint16')。如果N为240,则uint16会起作用,但uint8也会有效,并且是我可以用来保存数字的最小数据类型。

这是我初始化数组的方法。我正在寻找SOMETHING_DEPENDING_ON_N

import numpy as np
# N is known by some other calculation.
lbls = np.zeros( (10,20), dtype=np.dtype( SOMETHING_DEPENDING_ON_N ) )

喝彩!

啊哈!

刚刚意识到numpy v1.6.0 +有np.min_scalar_typedocumentation。 D'哦! (虽然答案仍然有用,因为我没有1.6.0)。

3 个答案:

答案 0 :(得分:2)

创建最大值到type的映射,然后查找大于N的最小值。

typemap = {
  256: uint8,
  65536: uint16,
   ...
}

return typemap.get(min((x for x in typemap.iterkeys() if x > N)))

答案 1 :(得分:2)

如何编写一个简单的函数来完成这项工作?

import numpy as np

def type_chooser(N):
    for dtype in [np.uint8, np.uint16, np.uint32, np.uint64]:
        if N <= dtype(-1):
            return dtype
    raise Exception('{} is really big!'.format(N))

使用示例:

>>> type_chooser(255)
<type 'numpy.uint8'>
>>> type_chooser(256)
<type 'numpy.uint16'>
>>> type_chooser(18446744073709551615)
<type 'numpy.uint64'>
>>> type_chooser(18446744073709551616)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "spam.py", line 6, in type_chooser
    raise Exception('{} is really big!'.format(N))
Exception: 18446744073709551616 is really big!

答案 2 :(得分:0)

感兴趣的是,这是我一直在玩的版本,直到@Ignacio Vazquez-Abrams和@wim发布了他们的答案,使用了bithifts:

def minimal_uint_type(N):
    bases = [8,16,32,64]
    a = [N>>i for i in bases]
    try: dtype = bases[len(np.nonzero(a)[0])]
    except: raise StandardError('{} is really big!'.format(N))
    return dtype