Numpy数组访问优化

所以,我有一个庞大的numpy数组(超过1000万个元素甚至更多)然后我有一个循环,它访问大型数组。

在每次迭代中,循环遍历相邻索引列表,从numpy数组中检索值。 目前,我对大数组进行分片,然后检索值。

例如:循环需要访问[1000, 1000], [1001, 1000], [1002,999]它将采用array[1000:1003, 999 : 1001] [1000, 1000], [1001, 1000], [1002,999] array[1000:1003, 999 : 1001]的切片,然后访问元素。

这是降低循环的性能,还是增加它(理论上)?


从我记得,切片完成复制列表部分到内存。 我不确定,但我几乎可以肯定这个操作是O(1)。 但直接访问,就像

container = [] for i in range(a,b): container.append(l[i])

它通常更快。


arr1 = arr[1000:1003, 999 : 1001]arrview 。 这意味着它是一个新的数组对象,具有自己的形状和步幅,但它与arr共享数据缓冲区。 (我可以详细了解它是如何分享的,但我认为这不重要。)

arr[1000, 1000] arr[1002,999]arr[1001, 1000]arr[1002,999]arr单独元素。 arr1[0,1]arr1[1,1]arr1[2,0]引用相同的元素(如果我已经完成了数学计算)。 我的教育猜测是访问时间将是相同的。

这三个元素可以一次提取,一个副本,

arr2 = arr[[1000, 1001, 1002],[1000, 1000, 999]]

我期待这一点

for x in arr:
   <do something with x>

将比...更快

for idx in [[1000, 1000], [1001, 1000], [1002,999]]:
    x = arr[idx]
    <do something with x>

但“做某件事”的时间很可能会超过索引时间。

但我鼓励你设置一个测试用例,并尝试其他选择。 亲自看看有什么不同。

链接地址: http://www.djcxy.com/p/36365.html

上一篇: Numpy array access optimization

下一篇: Is an array of arrays cache local?