Python 整数位长度

Python 整数位长度,python,numpy,Python,Numpy,我想找到用二进制表示无符号numpy整数(或整数数组中的每个元素)所需的位数,就像python的int.bit_length()一样,但似乎numpy没有等效的函数 例如: >>int(0b1000).位长度() 4. >>>np.uint8(0b1000).位长度() AttributeError:'numpy.uint8'对象没有属性'bit\u length' 有人能帮我找到正确的函数吗?我目前的方法是将每个数组元素转换为python int以查找位长度,这似乎是一个糟糕的选项,以提高速

我想找到用二进制表示无符号numpy整数(或整数数组中的每个元素)所需的位数,就像python的
int.bit_length()
一样,但似乎numpy没有等效的函数

例如:

>>int(0b1000).位长度()
4.
>>>np.uint8(0b1000).位长度()
AttributeError:'numpy.uint8'对象没有属性'bit\u length'
有人能帮我找到正确的函数吗?我目前的方法是将每个数组元素转换为python int以查找位长度,这似乎是一个糟糕的选项,以提高速度和清晰度:

np.vectorize(lambda np\u int:int(np\u int).bit\u length())

您可以获取阵列log2的上限

import numpy as np

x = np.random.randint(0, 100, size=30)
x
# returns:
array([92,  7, 53, 24, 85, 53, 78, 52, 99, 91, 79, 40, 82, 34, 18, 26, 20,
        7, 47, 38, 78, 50, 15, 12, 54,  3, 91, 82, 22, 90])

np.ceil(np.log2(x)).astype(int)
# returns:
array([7, 3, 6, 5, 7, 6, 7, 6, 7, 7, 7, 6, 7, 6, 5, 5, 5, 3, 6, 6, 7, 6,
       4, 4, 6, 2, 7, 7, 5, 7])
试试这个:

np.uint8(0b1000).nbytes*8

如果末尾的*8仅仅是每个字节的位数

,那么似乎
位长度()
确定了一个唯一的值
k
,这样
2**(k-1)这样的值有什么用?c或数字数组的值?您不能将数据类型更改为匹配。@hpaulj这是根据位的连续性对数字进行分类的算法的一部分,例如,6(
0b110
)中的所有位都是连续的,但5(
0b101
)是不连续的,因为1之间有0。谢谢,但我正在寻找数字本身的函数,不是用于存储数字的最小字节数。例如,2(
0b10
)是一个2位数字,即使它必须在内存中至少占用一个字节(
0b00000010
)谢谢,这看起来很棒!我有点担心日志函数对速度的影响,但它实际上比我尝试的向量化函数提高了大约16倍的性能!内置函数的性能总是优于向量化函数。