我正在用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_type
,documentation。 D'哦! (虽然答案仍然有用,因为我没有1.6.0)。
答案 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