Numpy:这是切片的最快方式+剩余的'一个mulltidim阵列?

时间:2016-02-26 08:55:37

标签: python arrays numpy

假设我有一个多维Numpy数组。现在我想:

  • 切出由startIndexendIndex定义的特定行范围
  • 使用原始数组减去切片获取数组(因此左侧)。

下面的代码可以解决这个问题,但这是性能最强的吗?

  • 因为我的数组很大,我可以(内存中性)切出原始数组,以便之后原始数组是剩下的。那么除了新阵列标题的一些开销之外,这将不需要额外的内存吗?

  • 我的代码段是否在下方(创建新数组),如果保留原始数组,是最有效的解决方案?

示例:

import numpy as np
X = np.random.random((6, 2))
print('Orig',X)
startIndex = 2
endIndex = 4
print('Slice ',X[startIndex:endIndex])
print('LeftOver ',np.concatenate((X[:startIndex-1],X[endIndex:])))

输出:

Orig [[ 0.94661646  0.3911347 ]
 [ 0.6807441   0.676658  ]
 [ 0.81109554  0.18089991]
 [ 0.6161699   0.19907537]
 [ 0.12859196  0.34866049]
 [ 0.22283545  0.04949782]]
Slice  [[ 0.81109554  0.18089991]
 [ 0.6161699   0.19907537]]
LeftOver  [[ 0.94661646  0.3911347 ]
 [ 0.12859196  0.34866049]
 [ 0.22283545  0.04949782]]

1 个答案:

答案 0 :(得分:1)

Concatenate制作副本,如果订单很重要,你需要它。

但如果你的切片很薄,订单无关紧要,那么更经济的方式可能是:

import numpy as np
size=6
X = np.random.random((size, 2))
print('Orig\n',X)
startIndex = 3
endIndex = 5
Slice=X[startIndex:endIndex].copy()
length = min(endIndex-startIndex,size-endIndex) # to check overlap
X[startIndex:startIndex+length]=X[-length:]
Left=X[:size-len(Slice)]
print('Slice\n',Slice)
print('LeftOver\n',Left)

因为最多复制切片大小的2倍,而不是整个数组。

它给出了:

Orig
 [[ 0.39351322  0.42100711]
 [ 0.14793363  0.12149344]
 [ 0.94524844  0.22004186]
 [ 0.816418    0.35630767]
 [ 0.37781821  0.12336287]
 [ 0.65995888  0.23812275]]
Slice
 [[ 0.816418    0.35630767]
 [ 0.37781821  0.12336287]]
LeftOver
 [[ 0.39351322  0.42100711]
 [ 0.14793363  0.12149344]
 [ 0.94524844  0.22004186]
 [ 0.65995888  0.23812275]]