假设我有一个多维Numpy数组。现在我想:
startIndex
和endIndex
定义的特定行范围。下面的代码可以解决这个问题,但这是性能最强的吗?
因为我的数组很大,我可以(内存中性)切出原始数组,以便之后原始数组是剩下的。那么除了新阵列标题的一些开销之外,这将不需要额外的内存吗?
我的代码段是否在下方(创建新数组),如果保留原始数组,是最有效的解决方案?
示例:
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]]
答案 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]]