python - 在python中创建子矩阵
问题描述
给定一个矩阵 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 的转置可能比 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 语句的情况下将其嵌套在另一个类似的理解中 - 但是这可能会很尴尬,因为您实际上并没有构建一个输出矩阵( S_i 很容易是不同的维度,除非您是以某种方式保证在 W 的每一列中都有相同数量的 1)。这实际上提出了您想要什么的问题——这些数组 S_i 的列表?否则,如果它们是您编写的单独变量,则没有好方法以可概括的方式引用它们,因为它们没有索引。
推荐阅读
- checkbox - 在 Android Studio 中检查 Sharedpreferences 保存复选框
- python - 如何替换网格中的对角线条目
- qt - 在主窗口 PyQt5 中打开窗口
- gitlab - gitlab-runner & fastlane - 找不到 OneSignal 扩展配置文件
- parsley.js - Parsley 错误消息中的变量未更新
- python-3.x - Python3,如何正确编码这个字符串?
- java - j = i + 1 和 j = ++i 之间的差异;
- javascript - 有一些 CSS 问题
- regex - 在 Chrome 中,最终使用带有正则表达式的重定向扩展,如何将所有 facebook.com URL 重定向到 mbasic.facebook.com URL
- javascript - 检测泛型类型参数是否具有 id 属性?