Numpy:这是切割mulltidim数组的最快方法吗?

2024-09-28 22:23:20 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个多维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]]

Tags: 内存代码numpy技巧定义np切片slice
1条回答
网友
1楼 · 发布于 2024-09-28 22:23:20

连接制作一个副本,如果顺序很重要,您需要它。你知道吗

但如果你的切片很薄,而且顺序无关紧要,那么更经济的方法是:

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]]

相关问题 更多 >