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

2024-04-18

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

int('000011000',2)

我想知道在 numpy 中是否有更快更好的方法来做到这一点。我正在研究的 numpy 数组的一个例子是这样的:

array([['0001'],
       ['0010']], 
      dtype='|S4')

我希望将其转换为:

array([[1],[2]])

一个可以使用np.fromstring http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.fromstring.html将每个字符串位分离成uint8输入数字,然后使用一些maths使用矩阵乘法转换/减少为十进制格式。因此,随着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)

运行时测试

让我们对迄今为止列出的所有解决问题的方法进行计时,包括@Kasramvd's loopy solution https://stackoverflow.com/a/37373537/3293881.

In [198]: # Setup a huge array of such strings
     ...: A = np.array([['0001'],['1001'],['1100'],['0010']],dtype='|S4')
     ...: A = A.repeat(10000,axis=0)


In [199]: def app1(A):             
     ...:     str2num = (np.fromstring(A, dtype=np.uint8)-48).reshape(-1,4)
     ...:     de2bi_convarr = 2**np.arange(3,-1,-1)
     ...:     out = str2num.dot(de2bi_convarr)    
     ...:     return out
     ...: 
     ...: def app2(A):             
     ...:     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)    
     ...:     return out
     ...: 

In [200]: %timeit app1(A)
1000 loops, best of 3: 1.46 ms per loop

In [201]: %timeit app2(A)
10 loops, best of 3: 36.6 ms per loop

In [202]: %timeit np.array([[int(i[0], 2)] for i in A]) # @Kasramvd's solution
10 loops, best of 3: 61.6 ms per loop
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将位串 numpy 数组转换为以 2 为基数的整数的最快方法 的相关文章

随机推荐

  • Symfony 4. InheritanceType("JOINED") 和 ParamConverter。奇怪的现象

    我已经定义了 CoreCase 类 ORM Entity repositoryClass App Repository CoreCaseRepository ORM InheritanceType JOINED ORM Discrimina
  • 块和保留周期

    一个小问题 为什么 Xcode 会抱怨listing 1会导致保留周期 而在listing 2它不是 在这两种情况下 clients is an int实例变量 在listing 2它被分配了0 in the init method 背景信
  • Powershell命令:rm -rf

    rm是删除item 但是参数是多少 rf做或表示 每当我输入 help rf 时 它都会打印 powershell 中可用命令的完整列表 如果您输入会发生什么rm rf在 powershell 中 通过阅读周围的资料 我发现它会删除驱动器上
  • GitHub Atom - 删除编辑器中的中心线

    我刚刚下载了 GitHub Atom Editor 正在对其进行自定义 但我无法删除编辑器中间的那行 有人帮我看看如何删除那条线吗 该行由wrap guide 包提供 您可以使用以下选项来删除该行 Option 1 禁用换行指南包裹 去At
  • 使用 XML 和 XSLT 生成 SQL

    我有一个 XML 定义 其中包含一个带有子元素的元素 例如 a b b a
  • 可以用宏获取评论吗?

    我试图解析一些代码并重新格式化它们 但似乎引用只会忽略注释 有什么办法可以实现这一点吗 我想我必须深入 erlang 方面 不 您无法在宏内获取代码注释 它们永远不会成为 AST 的一部分 并且仍然被丢弃在 Elixir 的标记器中
  • 使用 CRON 作业执行 PHP 脚本 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想每天午夜运行一个 PHP 脚本
  • JPEG 标头丢失/损坏

    我有一个 130kb jpeg 图像 无法在任何程序中打开 我需要修复它 从我使用的各种图像恢复软件中 我得到的只是 图像头损坏 丢失 当我查找文件的属性时 我什至没有得到任何信息 没有尺寸等 只有文件大小 一旦图像的标头丢失 是否可以恢复
  • 如何在 Ruby 中进行模糊子字符串匹配?

    我发现了很多关于模糊匹配的链接 将一个字符串与另一个字符串进行比较 看看哪个字符串的相似度得分最高 我有一个很长的字符串 一个文档 和一个子字符串 子字符串来自原始文档 但已被转换多次 因此可能会引入奇怪的工件 例如这里有一个空格 那里有一
  • Neo4j 的数据库级验证

    我使用 Neo4j 作为我的图形数据库 假设我想限制用户名字段的长度小于10 有没有办法在数据库级别施加这样的约束 现在 您必须在应用程序级别上执行此操作 或者通过注册一个事务提交挂钩来检查该属性字段是否符合特定标准 See http do
  • 免费的 XSD 到 DTD 转换实用程序?

    我有一个 XSD XML 架构 需要将其转换为 DTD 有免费的实用程序或简单的方法来完成此任务吗 例如 XSLT Python 脚本也很受欢迎 Note 这是问题的相反方向免费 DTD 到 XSD 转换实用程序 https stackov
  • Akka Actor 询问和类型安全

    我如何使用 Akka Actor Ask 并维护类型安全 或者避免使用 询问 而使用 告诉 打电话时 or ask在 Akka Actor 上 Future Any 返回 我必须通过进行显式转换future mapTo MyType 我不喜
  • Android - 拥有多个共享首选项是不好的做法吗?

    我有一个应用程序使用SharedPreferences 一个仅存储应用程序版本以检查更改日志的更新 另一个包含一些布局信息clear 当用户选择时被调用 我终于设法得到了PreferenceFragment工作并注意到一种趋势 所以我想在我
  • Spring Boot:是否可以使用 fat jar 在任意目录中使用外部 application.properties 文件?

    是否可以有多个 application properties 文件 EDIT 请注意 这个问题演变成了标题上的问题 我尝试有2个文件 第一个位于应用程序 Jar 中的根文件夹中 第二个位于类路径中指定的目录中 2 个文件都命名为 appli
  • 创建 SSIS 包 - 将数据从 Oracle 复制到 SQL Server

    我想编写一个 SSIS 包 用于将数据从 Oracle 复制到 MS Sql 服务器 而且条件是 通过在 SQL 中选择一个表 就可以知道哪些数据必须从 oracle 移动到 SQL 基本上 如果 SQL Server 中的该表中没有该值
  • OpenCV 无法从网络摄像头捕获帧

    我在 VS2010 中使用 OpenCV 2 4 6 我认为我的网络摄像头无法捕获该帧 当我执行代码时 它构建成功 但我没有得到输出 我想 当我检查时if bSuccess 它已执行并且无法从网络摄像头捕获帧 我该如何解决这个问题 我的代码
  • 按数据框的子段对数据框进行排序

    我和我的团队正在处理数千个具有相似段的 URL 有些 URL 在我们感兴趣的位置有一个段 seg 复数 segs 其他类似的 URL 在我们感兴趣的位置上有不同的段 我们需要对由 URL 和关联的唯一段组成的数据框进行排序 在感兴趣的位置
  • 只为 IE 设置 CSS?

    我有一个简单的div具有 2px 厚的边框和绝对定位 直到其父元素悬停在其上方时才会隐藏 由于IE盒子模型 所说的位置div在 IE 中有些关闭 但在其他浏览器中则不然 我不想为 IE 添加完全独立的样式表 我只想在浏览者使用 IE 时修改
  • 如果您不打算从自适应渲染中受益,那么使用 HtmlTextWriter 有什么好处吗?

    除了从替代设备的自适应渲染中受益之外 编写所有这些代码是否有意义 writer WriteBeginTag table writer WriteBeginTag tr writer WriteBeginTag td writer Write
  • 将位串 numpy 数组转换为以 2 为基数的整数的最快方法

    我有一个由位串组成的 numpy 数组 我打算将位串转换为以 2 为基数的整数 以便执行一些异或按位运算 我可以在 python 中将字符串转换为以 2 为基数的整数 int 000011000 2 我想知道在 numpy 中是否有更快更好