在 python 中创建子矩阵
Creating submatrix in python
给定一个矩阵 S 和一个二进制矩阵 W,我想创建一个对应于 W 的非零坐标的 S 的子矩阵。
例如:
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,为每个问题编写一个 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_1(对应W的第1列)是
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 的转置而不是 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 的转置。如果您 need/want 坚持使用 W,则需要反转索引 i 和 j。
至于外循环,您可以尝试将其嵌套在另一个没有 if 语句的类似理解中——但这可能很尴尬,因为您实际上并没有构建一个输出 matrix(S_i 可以很容易地是不同的维度,除非你以某种方式保证在 W 的每一列中有相同数量的 1)。这实际上提出了您想要什么的问题——这些数组的列表 S_i?否则,如果它们像您所写的那样是单独的变量,则没有好的方法可以通用地引用它们,因为它们没有索引。
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]]
给定一个矩阵 S 和一个二进制矩阵 W,我想创建一个对应于 W 的非零坐标的 S 的子矩阵。
例如:
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,为每个问题编写一个 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_1(对应W的第1列)是
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 的转置而不是 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 的转置。如果您 need/want 坚持使用 W,则需要反转索引 i 和 j。
至于外循环,您可以尝试将其嵌套在另一个没有 if 语句的类似理解中——但这可能很尴尬,因为您实际上并没有构建一个输出 matrix(S_i 可以很容易地是不同的维度,除非你以某种方式保证在 W 的每一列中有相同数量的 1)。这实际上提出了您想要什么的问题——这些数组的列表 S_i?否则,如果它们像您所写的那样是单独的变量,则没有好的方法可以通用地引用它们,因为它们没有索引。
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]]