Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将位字符串numpy数组转换为整数基2的最快方法_Python_Arrays_Numpy_Int_Bitstring - Fatal编程技术网

Python 将位字符串numpy数组转换为整数基2的最快方法

Python 将位字符串numpy数组转换为整数基2的最快方法,python,arrays,numpy,int,bitstring,Python,Arrays,Numpy,Int,Bitstring,我有一个由位字符串组成的numpy数组,我打算将位字符串转换为整数基2,以便执行一些按位异或操作。在python中,我可以使用以下方法将字符串转换为以2为基数的整数: int('000011000',2) 我想知道在numpy是否有更快更好的方法来做到这一点。我正在研究的numpy数组示例如下: array([['0001'], ['0010']], dtype='|S4') 我希望将其转换为: array([[1],[2]]) 可以使用将每个字符串位分离为ui

我有一个由位字符串组成的numpy数组,我打算将位字符串转换为整数基2,以便执行一些按位异或操作。在python中,我可以使用以下方法将字符串转换为以2为基数的整数:

int('000011000',2)
我想知道在numpy是否有更快更好的方法来做到这一点。我正在研究的numpy数组示例如下:

array([['0001'],
       ['0010']], 
      dtype='|S4')
我希望将其转换为:

array([[1],[2]])
可以使用将每个字符串位分离为
uint8
类型的数字,然后使用矩阵乘法的数学运算将其转换/还原为十进制格式。因此,使用
A
作为输入数组,一种方法是这样的-

# Convert each bit of input string to numerals
str2num = (np.fromstring(A, dtype=np.uint8)-48).reshape(-1,4)

# Setup conversion array for binary number to decimal equivalent
de2bi_convarr = 2**np.arange(3,-1,-1)

# Use matrix multiplication for reducing each row of str2num to a single decimal
out = str2num.dot(de2bi_convarr)
样本运行-

In [113]: A    # Modified to show more variety
Out[113]: 
array([['0001'],
       ['1001'],
       ['1100'],
       ['0010']], 
      dtype='|S4')

In [114]: str2num = (np.fromstring(A, dtype=np.uint8)-48).reshape(-1,4)

In [115]: str2num
Out[115]: 
array([[0, 0, 0, 1],
       [1, 0, 0, 1],
       [1, 1, 0, 0],
       [0, 0, 1, 0]], dtype=uint8)

In [116]: de2bi_convarr = 2**np.arange(3,-1,-1)

In [117]: de2bi_convarr
Out[117]: array([8, 4, 2, 1])

In [118]: out = str2num.dot(de2bi_convarr)

In [119]: out
Out[119]: array([ 1,  9, 12,  2])

可以建议另一种方法来避免
np.fromstring
。使用此方法,我们将在开始时转换为int数据类型,然后分离出每个数字,这应该相当于前面方法中的
str2num
。代码的其余部分将保持不变。因此,另一种实施方式是:-

# Convert to int array and thus convert each bit of input string to numerals
str2num = np.remainder(A.astype(np.int)//(10**np.arange(3,-1,-1)),10)

de2bi_convarr = 2**np.arange(3,-1,-1)
out = str2num.dot(de2bi_convarr)

运行时测试

让我们计算一下迄今为止列出的解决问题的所有方法,包括

鉴于此,我建议使用列表理解的方法:

>>> np.array([[int(i[0], 2)] for i in a])
array([[1],
       [2]])
>>> np.array([[int(i[0], 2)] for i in a])
array([[1],
       [2]])