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]
是arr
的view
。 这意味着它是一个新的数组对象,具有自己的形状和步幅,但它与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