无法切片 numpy 数组输入

扎眼的阳光 python 199

原文标题unable to slice numpy array input

预期输出:[[1,0][1,0]]预期输出:[[0,0][0,1]]等循环运行范围。错误:在打印语句。循环无法运行通过不同的索引。错误消息只有整数标量数组可以转换为标量索引

import numpy as np
field = [[1, 0, 0, 0, 0, 1, 1, 0, 0, 0],
    [1, 0, 1, 0, 0, 0, 0, 0, 1, 0],
    [1, 0, 1, 0, 1, 1, 1, 0, 1, 0],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
    [0, 0, 0, 0, 1, 1, 1, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
    [0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
 a2= np.array(field)
 print(a2)
 for i in list(range(10)):
      for i in a2[i:i+2,i:i+2]:
         print(a2[i:i+2,i:i+2])

原文链接:https://stackoverflow.com//questions/71685678/unable-to-slice-numpy-array-input

回复

我来回复
  • Lia的头像
    Lia 评论

    如果您的目标是每次使用步骤 1 从左到右和从上到下迭代 a2 时打印出一个 2 x 2 矩阵,那么 for 循环应该如下所示:

    for i in range(9):
        for j in range(9):
            print(a2[i:i+2, j:j+2])
    

    输出是:

    [[1 0]
     [1 0]]
    [[0 0]
     [0 1]]
    [[0 0]
     [1 0]]
    [[0 0]
     [0 0]]
    [[0 1]
     [0 0]]
    

    等等。

    2年前 0条评论
  • playerJX1的头像
    playerJX1 评论

    里面的for循环应该是for j in a2[i:i+2,i:i+2]:才能工作。这好像是

    for i in range(10): 
        print(a2[i:i+2,i:i+2])
    

    给出相同的结果

    2年前 0条评论
  • im_vutu的头像
    im_vutu 评论

    错误是说您使用过 i 一次,然后它不是一个遍历索引的数组。为什么要使用两个 for 循环?一为能胜任。再次无需在范围内投射列表。

    for i in range(10):
        print(a2[i:i+2,i:i+2])
    
    2年前 0条评论
  • aaossa的头像
    aaossa 评论

    您可以使用 2×2 窗口迭代矩阵,方法是使用矩阵的形状作为参考并使用 for 循环来滑动每个维度(x 和 y)。这是一个可能的实现:

    for i in range(2, a2.shape[0]):
        for j in range(2, a2.shape[1]):
            print(a2[i-2:i,j-2:j])
    
    2年前 0条评论
  • hpaulj的头像
    hpaulj 评论

    检查循环期间的值。这是基本的python循环逻辑

    In [310]: for i in range(2):        # don't need list(range...)
         ...:     print(i)
         ...:     print(a2[i:i+2, i:i+2])
         ...:     for i in a2[i:i+2, i:i+2]:
         ...:         print(i)
         ...: 
         ...: 
    0              # outer i
    [[1 0]         # the a2 window
     [1 0]]
    [1 0]          # inner i, rows of that window
    [1 0]
    1              # outer i
    [[0 1]
     [0 1]]
    [0 1]
    [0 1]
    

    将内部i用作a2的索引是没有意义的。它们已经是从a2派生的数组。我不知道为什么初学者会犯这个错误

     for i in alist:
         alist[i] ...   # i is an element of the list, not an index
    

    i存在np.array([1,0]),这个:

    a2[i:i+2,i:i+2]
    # a2[np.array([1,0]):np.array([3,2]), ....)
    

    产生你的错误。

    你第一个i in range用对了;为什么要改变第二个?

    在第二个循环中使用不同的迭代变量,并且range再次产生更合乎逻辑的嵌套迭代:

    In [313]: for i in range(2):
         ...:     print(i)
         ...:     for j in range(2):
         ...:         print(j)
         ...:         print(a2[i:i+2, j:j+2])
    
    2年前 0条评论