我正在使用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数组中输入高值是否有任何解决方法?
答案 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数组中的对象要快(也不容易处理)。