numpy.dtype = object与numpy.dtype = int相比非常慢

时间:2018-09-12 20:59:23

标签: python numpy object int

我正在使用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非常慢。

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

您可以看到dtype = int更快。

那么在numpy数组中输入高值是否有任何解决方法?

1 个答案:

答案 0 :(得分:2)

基于用户的评论:

  

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

一个更简单的解决方案是加载二进制数组(此处使用的虚拟数据,形状=人x视频),然后比较与您的两个人相对应的两行(例如,人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 int保留在Python列表中,这比将它们存储为numpy数组中的对象要快(也不容易处理)。