Python 如何检查矩阵的某些元素并相应地生成一组矩阵?

Python 如何检查矩阵的某些元素并相应地生成一组矩阵?,python,arrays,numpy,indexing,Python,Arrays,Numpy,Indexing,我尝试检查2D数组(矩阵)的元素,并根据以下条件生成大量矩阵(大小相等): 以我的矩阵为例: x = [[1, 0, 2],[7, 0, 7],[1, 1, 1]] 我需要检查(2)并生成两个矩阵,其中(2)的位置将分别替换为0和1。我还需要检查7并生成3个矩阵组合,其中7的值分别为(0,1)、(1,0)、(1,1)。这意味着生成的矩阵总数为6,如下所示: [[1, 0, 0],[0, 0, 1],[1, 1, 1]] [[1, 0, 0],[1, 0, 0],[1, 1, 1]] [[1,

我尝试检查2D数组(矩阵)的元素,并根据以下条件生成大量矩阵(大小相等):

以我的矩阵为例:

x = [[1, 0, 2],[7, 0, 7],[1, 1, 1]]
我需要检查(2)并生成两个矩阵,其中(2)的位置将分别替换为0和1。我还需要检查7并生成3个矩阵组合,其中7的值分别为(0,1)、(1,0)、(1,1)。这意味着生成的矩阵总数为6,如下所示:

[[1, 0, 0],[0, 0, 1],[1, 1, 1]]
[[1, 0, 0],[1, 0, 0],[1, 1, 1]]
[[1, 0, 0],[1, 0, 1],[1, 1, 1]]
[[1, 0, 1],[0, 0, 1],[1, 1, 1]]
[[1, 0, 1],[1, 0, 0],[1, 1, 1]]
[[1, 0, 1],[1, 0, 1],[1, 1, 1]]
可以有1(2)个以上,7的位置可以是垂直的或水平的

我尝试了一种简单的方法,只是在x中循环寻找2并附加:

for i in range(len(x)):
  for j in range(len(x[0])):
    if x[i][j] == 2:
      inter[i][j] = 0
      test.append(inter)
      inter2[i][j] = 1
      test.append(inter2)

但只有当我的值只有2时,这才有效。我还尝试转换为numpy数组,并使用where()查找2和7的索引,但不知道如何使用它们生成所需的结果。有什么想法吗?

描述的情况非常模糊。如果我理解正确,您希望:

sevens = [[0,1],[1,0],[1,1]]
twos = [0,1]

for i in twos:
    for j in sevens:
        m = x.copy()
        m[m==2] = i
        m[m==7] = j
        print(m)
输出:

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

更新:每个OP对(2)个多重性的评论:

x = np.array([[2, 0, 2],[7, 0, 7],[1, 1, 1]])
sevens = [[0,1],[1,0],[1,1]]
v = (x==2).sum()*([0,1],)
twos = np.array(np.meshgrid(*v)).T.reshape(-1,2)

for i in twos:
    for j in sevens:
        m = x.copy()
        m[m==2] = i
        m[m==7] = j
        print(m)
输出:

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

描述的条件非常模糊。如果我理解正确,您希望:

sevens = [[0,1],[1,0],[1,1]]
twos = [0,1]

for i in twos:
    for j in sevens:
        m = x.copy()
        m[m==2] = i
        m[m==7] = j
        print(m)
输出:

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

更新:每个OP对(2)个多重性的评论:

x = np.array([[2, 0, 2],[7, 0, 7],[1, 1, 1]])
sevens = [[0,1],[1,0],[1,1]]
v = (x==2).sum()*([0,1],)
twos = np.array(np.meshgrid(*v)).T.reshape(-1,2)

for i in twos:
    for j in sevens:
        m = x.copy()
        m[m==2] = i
        m[m==7] = j
        print(m)
输出:

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

当有两(2)个以上的值时,是否希望所有值都替换为所有0(和所有1)或0和1的任意组合?交替,意思是如果我有[[1,0,0]、[2,0,2]、[1,1,1]],我的结果应该是:[[1,0,0]、[0,0,0]、[1,1,1]、[1,0,0]、[0,0,1]、[1,1]、[1,0,0,0]、[1,0,0]、[1,1]、[1,1]、[1,1]您的评论中“:”之后没有结果?我想你可能错过了。请查看张贴的答案是否是您要寻找的。如果没有,请详细说明。谢谢你[[1,0,0]、[0,0,0]、[1,1,1]、[1,0,0]、[0,0,1]、[1,0,0]、[1,0,0]、[1,1,1]、[1,0,0]、[1,0,1]、[1,0,1]、[1,1,1,1]、[1,0,1]、[1,0,1]、[1,0,1]、[1,0,0,1]、[1,0,0,1]、[1]如果我不清楚的话,很抱歉,原始矩阵中的1和0保持不变,2用0/1来更改,如果我有一个(2),那么我得到(0,1),如果我得到三个)(00000 1010011100101110111)无论2位于何处。当有两(2)个以上的时,是否希望所有的0(和所有1)或0和1的任何组合替换它们?交替,意思是如果我有[[1,0,0],[2,0,2],[1,1,1]],我的结果应该是:[[1,0,0],[0,0],[1,1,1],[[1,0,0],[0,0],[0,0],[0,0],[0,0],[1,1],[1,1],[1,1],[1,0],[1,0,0]、[1,1,1]、[1,0,0]、[1,0,1]、[1,1,1]、[1,1,1]、[1,0,0]、[0,0,0,1]、[1,0,0,1]、[1,0,0,0,0]、[1,0,0]、[0,0,0,0,1]、[1,0,0,0,0,1]、[1,0,0,0,0,0]、[1,0,0,0,1]、[1,0,0,0]、[1,0,0]、[1,0,0,0]之后没有结果。我想知道你可能没有找到答案。如果没有答案,请详细说明,[1,1,1]]很抱歉,如果我不清楚,原始矩阵中的1和0保持不变,2将用0/1进行更改,如果我有一(2),那么我在该位置得到(0,1),如果我有三(2),我得到(000001010011100101110111),无论2位于何处。我得到不同的答案:[[0,1],[7,0,7],[1,1][[1,0],[7,0],[7,0,7],[1, 1, 1]] [[1, 1], [7, 0, 7], [1, 1, 1]] [[0, 1], [7, 0, 7], [1, 1, 1]] [[1, 0], [7, 0, 7], [1, 1, 1]] [[1, 1], [7, 0, 7], [1, 1, 1]]@user12195720您的意思是此代码的输出与打印的不一样吗?您如何获得非矩形数组作为输出?我怀疑您可能没有像上面那样运行此代码。我得到了不同的答案:[[0,1],[7,0,7],[1,1,1][[1,0],[7,0,7],[1,1,1][[1,1],[7,0,7],[1,1][[1,1][[1,0],[7,0,7],[1,1,1][[1,1],[7,0,7],[1,1,1]]@user12195720您的意思是这段代码的输出与打印的不一样吗?怎么可能得到一个非矩形数组作为输出?我怀疑您可能没有像上面那样运行代码。