【问题标题】:numpy.dtype=object very slow compared to numpy.dtype=intnumpy.dtype=object 与 numpy.dtype=int 相比非常慢
【发布时间】:2019-02-17 13:56:24
【问题描述】:

我正在使用 numpy.dtype=object 在 numpy 数组中输入高值(大于 2^70):

numpy.array([1], dtype=numpy.object) << 70
array([1180591620717411303424], dtype=object)

我在这里使用 dtype=numpy.object 的唯一原因是,当您尝试在其中输入高值时,超过了 numpy.int 的限制。

numpy.array([1]) << 70
>>> array([64], dtype=int32) #the result should have been array([1180591620717411303424], dtype=object)

详细信息在我的另一个问题here. 中进行了说明。在这种情况下,使用 dtype=object 可以正常工作。

但我发现使用 dtype=numpy.object 很慢。

为了验证,我比较了以下操作的时间:

您可以看到 dtype=int 快得多。

那么在 numpy 数组中输入高值有什么解决方法吗?

【问题讨论】:

  • docs.scipy.org/doc/numpy/user/basics.types.html,你最好的选择可能是uint64(仍然太小),或者使用双精度浮点数。
  • 这里的大图是什么?您想用这些庞大的数字实现什么目标?
  • 我正在建立一个人与视频的位图索引,其中我有很多视频(超过 1000 个),用于有限的一组人(大约 100 个)。因此,每个单元格代表该人是否出现在视频中(1)或不出现(0)。该表存储在一个文件中。现在,当我想知道两个人是否一起出现在视频中时,我会读取这两个人的相应行并执行按位“与”运算以获得结果并找到存在“1”的索引。所以做这个按位'AND',我需要先将二进制列表转换为整数,然后计算结果。
  • 每个视频使用一对 uint64 值,你必须有位掩码。如果需要,您可以定义这样的自定义 dtype。

标签: python numpy object int


【解决方案1】:

根据用户的评论:

我正在建立一个人与视频的位图索引,我有很多 为有限的一组人(大约 100 个)提供的视频(超过 1000 个)。所以 每个单元格表示该人是否出现在视频中 (1) 或 不是(0)。该表存储在一个文件中。现在当我想知道是否有两个 人们是否一起出现在视频中,然后我阅读了 这两个人的对应行并按位“与” 操作以获取结果并找到存在“1”的索引。 所以按位“与”,我需要将二进制列表转换为 先取整数,再计算结果。

一个非常更简单的解决方案是加载二进制数组(此处使用的虚拟数据,形状 = 人 x 视频),然后比较与您的两个人相对应的两行(比如第 10 个人和第 10 个人) 37) 使用 &,最后检索两者都出现的视频索引:

my_map = numpy.random.randint(0,2,(100, 1000), numpy.bool)
appear_together_in_video_index = numpy.where(my_map[10] & my_map[37])

这样,您只需要处理布尔值(8 位)并完全避免大数字问题。

要回答最初的问题,这并不是一个公平的比较。由于您的目标是处理大量数字,因此您应该在支持如此大量数字的两个解决方案之间执行时序测试。基本的替代方法是将 Python 整数保存在 Python 列表中,这并不比将它们作为对象存储在 numpy 数组中更快(也更容易处理)。

【讨论】:

  • 另外,我们可以优化吗?就像我想找到所有人一起出现的视频?这将对 my_map 矩阵的每一行进行“与”运算。那么,我们可以像我们做 np.sum(axis=0) 一样简单地对矩阵的每一行进行“与”运算吗?感谢您的宝贵时间!
  • 是的,你可以做 my_map.all(axis=0)。
  • 谢谢@Benjamin!你真的很棒!
猜你喜欢
  • 1970-01-01
  • 2021-02-13
  • 2017-05-07
  • 1970-01-01
  • 2015-01-27
  • 2014-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多