按数组切片

问题描述 投票:1回答:2

我有一个如下数组:

 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维数组进行切片?

python arrays numpy slice
2个回答
1
投票

您可以通过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]含义的替代版本。


0
投票

检查下面的代码:

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)
© www.soinside.com 2019 - 2024. All rights reserved.