如何通过3X3检索每个部分?

2024-10-03 09:10:21 发布

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

任何人都知道如何从此数组中检索节:

a=[[1, 3, 2, 5, 7, 9, 4, 6, 8],
  [4, 9, 8, 2, 6, 1, 3, 7, 5],
  [7, 5, 6, 3, 8, 4, 2, 1, 9],
  [6, 4, 3, 1, 5, 8, 7, 9, 2],
  [5, 2, 1, 7, 9, 3, 8, 4, 6],
  [9, 8, 7, 4, 2, 6, 5, 3, 1],
  [2, 1, 4, 9, 3, 5, 6, 8, 7],
  [3, 6, 5, 8, 1, 7, 9, 2, 4],
  [8, 7, 9, 6, 4, 2, 1, 5, 3]]

我的意思是我想检索第3X3节,例如,左上角的是:

[[1,3,2],
 [4,9,8],
 [7,5,6]]

需要检索的部分包括:

左侧部分

[[0:3,0:3]],[[3:6,0:3]],[[6:9,0:3]]

中段

[[0:3,3:6]],[[3:6,3:6]],[[6:9,3:6]]

右侧部分

[[0:3,6:9]],[[3:6,6:9]],[[6:9,6:9]]

如何检索所有这些部分? 有必要使用numpy吗?你知道吗


Tags: numpy数组中段
3条回答

您可以使用类似的方法:

for i in range(0, len(a), 3):
    left_section = []
    middle_section = []
    right_section = []
    left_section.append(a[i][:3])
    left_section.append(a[i+1][:3])
    left_section.append(a[i+2][:3])
    middle_section.append(a[i][3:6])
    middle_section.append(a[i+1][3:6])
    middle_section.append(a[i+2][3:6])
    right_section.append(a[i][3:6])
    right_section.append(a[i+1][3:6])
    right_section.append(a[i+2][3:6])
    print(left_section)
    print(middle_section)
    print(right_section)

或者

for i in range(0, len(a), 3):
    left_section = []
    middle_section = []
    right_section = []
    left_section.extend(a[i][:3])
    left_section.extend(a[i+1][:3])
    left_section.extend(a[i+2][:3])
    middle_section.extend(a[i][3:6])
    middle_section.extend(a[i+1][3:6])
    middle_section.extend(a[i+2][3:6])
    right_section.extend(a[i][3:6])
    right_section.extend(a[i+1][3:6])
    right_section.extend(a[i+2][3:6])
    print(left_section)
    print(middle_section)
    print(right_section)

这是一种使用reshaping和置换维度的矢量化方法-

a.reshape(3,3,3,3).transpose(2,0,1,3).reshape(9,3,3)

样本运行-

In [197]: a
Out[197]: 
array([[1, 3, 2, 5, 7, 9, 4, 6, 8],
       [4, 9, 8, 2, 6, 1, 3, 7, 5],
       [7, 5, 6, 3, 8, 4, 2, 1, 9],
       [6, 4, 3, 1, 5, 8, 7, 9, 2],
       [5, 2, 1, 7, 9, 3, 8, 4, 6],
       [9, 8, 7, 4, 2, 6, 5, 3, 1],
       [2, 1, 4, 9, 3, 5, 6, 8, 7],
       [3, 6, 5, 8, 1, 7, 9, 2, 4],
       [8, 7, 9, 6, 4, 2, 1, 5, 3]])

In [198]: a.reshape(3,3,3,3).transpose(2,0,1,3).reshape(9,3,3)
Out[198]: 
array([[[1, 3, 2],
        [4, 9, 8],
        [7, 5, 6]],

       [[6, 4, 3],
        [5, 2, 1],
        [9, 8, 7]],

       [[2, 1, 4],
        [3, 6, 5],
        [8, 7, 9]], ....

如果您需要展平每个这样的部分/窗口,只需调整最后的重塑,就像这样-

In [199]: a.reshape(3,3,3,3).transpose(2,0,1,3).reshape(9,9)
Out[199]: 
array([[1, 3, 2, 4, 9, 8, 7, 5, 6],
       [6, 4, 3, 5, 2, 1, 9, 8, 7],
       [2, 1, 4, 3, 6, 5, 8, 7, 9],
       [5, 7, 9, 2, 6, 1, 3, 8, 4],
       [1, 5, 8, 7, 9, 3, 4, 2, 6],
       [9, 3, 5, 8, 1, 7, 6, 4, 2],
       [4, 6, 8, 3, 7, 5, 2, 1, 9],
       [7, 9, 2, 8, 4, 6, 5, 3, 1],
       [6, 8, 7, 9, 2, 4, 1, 5, 3]])

下面是答案,使用列表理解

>>> [x[:3] for x in a[:3]]
[[1, 3, 2], [4, 9, 8], [7, 5, 6]]

左侧部分:

[x[0:3] for x in a[0:3]]
[x[0:3] for x in a[3:6]]
[x[0:3] for x in a[6:9]]

中段:

[x[3:6] for x in a[0:3]]
[x[3:6] for x in a[3:6]]
[x[3:6] for x in a[6:9]]

右侧部分:

[x[6:9] for x in a[0:3]]
[x[6:9] for x in a[3:6]]
[x[6:9] for x in a[6:9]]

a[i:j]取从索引i到j-1的直线 x[i,j]取所述行的索引i到j-1的元素

要创建“扁平”列表,请使用pwnsauce注释中的输入:

左侧部分:

[x for b in [x[0:3] for x in a[0:3]] for x in b]
[x for b in [x[0:3] for x in a[3:6]] for x in b]
[x for b in [x[0:3] for x in a[6:9]] for x in b]

中段:

[x for b in [x[3:6] for x in a[0:3]] for x in b]
[x for b in [x[3:6] for x in a[3:6]] for x in b]
[x for b in [x[3:6] for x in a[6:9]] for x in b]

右侧部分:

[x for b in [x[6:9] for x in a[0:3]] for x in b]
[x for b in [x[6:9] for x in a[3:6]] for x in b]
[x for b in [x[6:9] for x in a[6:9]] for x in b]

相关问题 更多 >