我有一个如下数组:
A =
[[ 1. 2. 3. 0. 0. 0. 0.]
[ 4. 5. 6. 0. 0. 0. 0.]
[ 7. 8. 9. 0. 0. 0. 0.]
[ 10. 11. 12. 0. 0. 0. 0.]
[ 13. 14. 15. 0. 0. 0. 0.]
[ 16. 17. 18. 0. 0. 0. 0.]
[ 19. 20. 21. 0. 0. 0. 0.]
[ 22. 23. 24. 0. 0. 0. 0.]
[ 25. 26. 27. 0. 0. 0. 0.]
[ 28. 29. 30. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0.]]
我也有一个向量v=[10, 3]
,它告诉我在哪里需要切片才能在左上角获取子矩阵:
A[0:v[0], 0:v[1]] =
[[ 1. 2. 3.]
[ 4. 5. 6.]
[ 7. 8. 9.]
[ 10. 11. 12.]
[ 13. 14. 15.]
[ 16. 17. 18.]
[ 19. 20. 21.]
[ 22. 23. 24.]
[ 25. 26. 27.]
[ 28. 29. 30.]]
假设我现在有一个n维数组A_n
,在它的左上角有一个子矩阵,如上所述。同样,有一个向量v_n
告诉我子矩阵的范围。
如何在不用手书写每个索引范围(即A_n[0:v_n[0], 0:v_n[1], 0:v_n[2] ...]
的情况下用向量对n维数组进行切片?
您可以通过mappinng构造slice
个对象的元组(冒号表示基本表示):
from functools import partial
A_n[tuple(map(partial(slice, 0), V_n))]
因此,如果V_n = [10, 3]
,我们将通过它:
>>> tuple(map(partial(slice, 0), [10, 3]))
(slice(0, 10, None), slice(0, 3, None))
这基本上是[0:10, 0:3]
含义的替代版本。
检查下面的代码:
A = [[1., 2., 3., 0., 0., 0., 0.], [4., 5., 6., 0., 0., 0., 0.], [7., 8., 9., 0., 0., 0., 0.],
[10., 11., 12., 0., 0., 0., 0.], [13., 14., 15., 0., 0., 0., 0.], [16., 17., 18., 0., 0., 0., 0.],
[19., 20., 21., 0., 0., 0., 0.], [22., 23., 24., 0., 0., 0., 0.], [25., 26., 27., 0., 0., 0., 0.],
[28., 29., 30., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0.]]
n = [10,3]
arrayA = []
for i in range(0,n[0]):
tempArray = []
for j in range(0,n[1]):
tempArray.append(j)
arrayA.append(tempArray)
print(arrayA)