使用Python,在行和列中提取矩阵的上一项和下一项

使用Python,在行和列中提取矩阵的上一项和下一项,python,list,matrix,arraylist,Python,List,Matrix,Arraylist,我有一个列表矩阵,如下表所示 Matrix=[[0,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,31,32],[33,34,35]]. 例如,我选择了矩阵[i][j],所以我想提取矩阵[i-1][j-1],矩阵[i-1][j+1],矩阵[i-1][j-1],矩阵[i][j-1],矩阵[i][j+1],矩阵[i+1][j-1],矩阵

我有一个列表矩阵,如下表所示


Matrix=[[0,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,31,32],[33,34,35]].

例如,我选择了
矩阵[i][j]
,所以我想提取
矩阵[i-1][j-1],矩阵[i-1][j+1],矩阵[i-1][j-1],矩阵[i][j-1],矩阵[i][j+1],矩阵[i+1][j-1],矩阵[i+1][j]和矩阵[i+1][j+1]


我可以循环进行吗?

这应该是您想要的

首先,让我们了解一下
i&j

import itertools
import numpy

def uc(nums):
    return set(itertools.product(*((num+1, num-1, num) for num in nums)))

nums = [1,2]

idx = uc(nums)

>>>{(0, 1), (0, 2), (0, 3), (1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3)}

m = np.array(Matrix)

array([[[ 0,  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, 31, 32],
        [33, 34, 35]]])
然后,我们可以使用
numpy
的元组索引功能来选择与这些索引匹配的所有行

[m[idx_] for idx_ in idx]

[array([3, 4, 5]),
 array([18, 19, 20]),
 array([21, 22, 23]),
 array([27, 28, 29]),
 array([15, 16, 17]),
 array([33, 34, 35]),
 array([30, 31, 32]),
 array([ 9, 10, 11]),
 array([6, 7, 8])]

这应该是你想要的

首先,让我们了解一下
i&j

import itertools
import numpy

def uc(nums):
    return set(itertools.product(*((num+1, num-1, num) for num in nums)))

nums = [1,2]

idx = uc(nums)

>>>{(0, 1), (0, 2), (0, 3), (1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3)}

m = np.array(Matrix)

array([[[ 0,  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, 31, 32],
        [33, 34, 35]]])
然后,我们可以使用
numpy
的元组索引功能来选择与这些索引匹配的所有行

[m[idx_] for idx_ in idx]

[array([3, 4, 5]),
 array([18, 19, 20]),
 array([21, 22, 23]),
 array([27, 28, 29]),
 array([15, 16, 17]),
 array([33, 34, 35]),
 array([30, 31, 32]),
 array([ 9, 10, 11]),
 array([6, 7, 8])]

我相信你能,你试过什么?你是说
矩阵[I-1][j-1]、矩阵[I-1][j]、矩阵[I-1][j+1]、矩阵[I][j-1]、矩阵[I][j+1]、矩阵[I+1][j-1]、矩阵[I+1][j]和矩阵[I+1][j+1]
?是的,我是的。但是如果我把一个整数而不是“i”和“j”,我就不能把它写在循环中-@dmitrypoloskii希望在一个元素周围接收8个元素。如果选择矩阵[2][1],答案应该是矩阵[1][0]、矩阵[1][1]、矩阵[1][2]、…、矩阵[3][1]、矩阵[3][2]@user2314737它实际上是9个元素我相信你可以,你试过什么?你是说
矩阵[i-1][j-1]、矩阵[i-1][j]、矩阵[i-1][j+1]、矩阵[i][j-1]、矩阵[i][j+1]、矩阵[i+1][j]和矩阵[i+1][j+1]
?是的,我是。但是如果我把一个整数而不是'i'和'j'写在一个循环中,我就不能把它写出来-@dmitrypoloski我想在一个元素周围接收8个元素。如果选择矩阵[2][1],答案应该是矩阵[1][0],矩阵[1][1],矩阵[1][2],…,矩阵[3][1],矩阵[3][2]@USER2314737实际上是9个元素。认为这是对的。@Dmitry Polonskiysorry我不知道。@Dmitry PolonskiyThanks。认为这是对的。@Dmitry Polonskiysorry我不知道。@Dmitry Polonskiysky