【问题标题】:Creating submatrix in python在python中创建子矩阵
【发布时间】:2021-09-27 17:07:04
【问题描述】:

给定一个矩阵 S 和一个二进制矩阵 W,我想创建一个 S 的子矩阵,对应于 W 的非零坐标。

例如:

S = [[1,1],[1,2],[1,3],[1,4],[1,5]]
W = [[1,0,0],[1,1,0],[1,1,1],[0,1,1],[0,0,1]]

我想得到矩阵

S_1 = [[1,1],[1,2],[1,3]]
S_2 = [[1,2],[1,3],[1,4]]
S_3 = [[1,3],[1,4],[1,5]]

我想不出在 python 中执行此操作的巧妙方法。我能为每个 S_i 做的最好的事情是

S_1 = S[0,:]

for i in range(np.shape(W)[0]):
    if W[i, 0] == 1:
        S_1 = np.vstack((S_1, S[i, :]))

但如果我想改变问题的维度并拥有 100 个 S_i,那么为每个 S_i 编写一个 for 循环似乎有点难看。 (旁注:S_1 应该初始化为一些空的二维数组,但我无法让它工作,所以将它初始化为 S[0,:] 作为占位符)。

编辑:澄清我的意思:

我有一个矩阵 S

1 1
1 2
1 3 
1 4
1 5

我有一个二进制矩阵

1 0 0
1 1 0
1 1 1
0 1 1
0 0 1

给定二元矩阵W的第一列

1
1
1
0
0

1 位于第一、第二和第三位。所以我想用每列的第一、第二和第三个位置创建一个对应的S子矩阵,所以S_1(对应W的第一列)是

1 1
1 2
1 3

同样,如果我们看一下 W 的第三列

0
0
1
1
1

1 在最后三个坐标中,所以我想要一个 S 的子矩阵,其中只有每列的最后三个坐标,称为 S_3

1 3
1 4
1 5

因此,给定二进制矩阵的任何第 i 列,我希望生成一个子矩阵 S_i,其中 S_i 的列包含 S 的列,但只有与第 i 列中 1 的位置相对应的条目二进制矩阵。

【问题讨论】:

  • 我不明白你在做什么。 W 中有 5 个条目,但您只显示 3 个输出矩阵。每个 W 行中只有 3 个条目,您如何在 S 中的 5 个条目之间进行选择? numpy 可以做间接寻址,但我们需要了解你想要什么。
  • 抱歉,我编辑了问题以澄清我的意思。用这种方式表达是否更有意义?

标签: python arrays submatrix


【解决方案1】:

使用 W 的转置可能比 W 本身更有用,这既是为了人类可读性,也是为了便于编写代码。这意味着影响每个 S_i 的条目被组合在 W 的一个内括号中,即在 W 的一行中,而不是现在的列中。

那么,S_i = np.array[S[j,:] for j in np.shape(S)[0] if W_T[i,j] == 1],其中 W_T 是 W 的转置。如果您需要/想要按原样使用 W,您需要反转索引 i 和 j。

至于外循环,您可以尝试将其嵌套在另一个类似的理解中而不使用 if 语句——但这可能会很尴尬,因为您实际上并没有构建一个输出 matrix(S_i可以很容易地成为不同的维度,除非您以某种方式保证在 W 的每一列中具有相同数量的 1)。这实际上提出了您想要什么的问题——这些数组 S_i 的列表?否则,如果它们是您编写的单独变量,则没有好方法以可概括的方式引用它们,因为它们没有索引。

【讨论】:

  • 我尝试做类似的事情,但我一直收到无效的语法错误,数组定义中的“for j...”。我认为那是因为我不能在 python3 中做那种事情。 (我不经常用 python 编写代码)。
  • 关于您的最后一条评论,我确实在处理 W 的每一列中 1 的数量相同的情况。那么有没有更好的方法来以可概括的方式引用它们?我只是假设我可以列出它们并编写一个遍历 i 的 for 循环。
  • 没关系。知道了!非常感谢!
【解决方案2】:

Numpy 可以直接做到这一点。

import numpy as np
S = np.array([[1,1],[1,2],[1,3],[1,4],[1,5]])
W = np.array([[1,0,0],[1,1,0],[1,1,1],[0,1,1],[0,0,1]])

for row in range(W.shape[1]):
    print(S[W[:,row]==1])

输出:

[[1 1]
 [1 2]
 [1 3]]
[[1 2]
 [1 3]
 [1 4]]
[[1 3]
 [1 4]
 [1 5]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 2016-10-23
    • 1970-01-01
    相关资源
    最近更新 更多