在python3中自动从较小的矩阵创建较大的矩阵

2024-10-01 00:21:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些较小的矩阵,我想合并成一个较大的矩阵。你知道吗

我试图用Numpy中的hstack命令来实现这一点,但它将每个组合视为一个字符串,而不是字符串所表示的矩阵。如果我手动编写hstack命令,它可以正常工作。你知道吗

import numpy as np 
import itertools as it 

sm01 = np.matrix( [[1],[1],[1]] ) 
sm02 = np.matrix( [[2],[2],[2]] )   
sm03 = np.matrix( [[3],[3],[3]] )   

Variables = ['sm01','sm02','sm03']
Comblst = ['']
for i in range(0, len(Variables)+1):
  for subset in it.combinations(Variables, i):
    a = str(subset).strip('()')
    Comblst = np.vstack([Comblst,a])

var = str(Comblst[6]).strip('[]').strip('""').strip(',').replace("'","")
var = tuple(var.split(', '))
LargeMatrix = np.hstack([var])

Tags: 字符串import命令varasnpit矩阵
1条回答
网友
1楼 · 发布于 2024-10-01 00:21:22

我认为应该使用list append来构建Conblst,而不是vstack。你知道吗

Comblst = []
for
    for 
        Comblst.append(a)

告诉我们Comblstvar的样子。我不能仅仅通过阅读代码来理解结构。你知道吗

那么hstack的结果是什么。你知道吗

=========================

Out[1087]: ['sm01', 'sm02', 'sm03']
In [1088]: Comblst
Out[1088]: 
array([[''],
       [''],
       ["'sm01',"],
       ["'sm02',"],
       ["'sm03',"],
       ["'sm01', 'sm02'"],
       ["'sm01', 'sm03'"],
       ["'sm02', 'sm03'"],
       ["'sm01', 'sm02', 'sm03'"]], 
      dtype='<U22')

In [1090]: var = str(Comblst[6]).strip('[]').strip('""').strip(',').replace("'",
      ...: "")
      ...: var = tuple(var.split(', '))
      ...: 
In [1091]: var
Out[1091]: ('sm01', 'sm03')

In [1092]: np.hstack([var])
Out[1092]: 
array(['sm01', 'sm03'], 
      dtype='<U4')

这只是一系列字符串操作,最好使用列表而不是数组。但目的是什么?你真的打算生产吗

In [1093]: np.hstack([sm01, sm03])
Out[1093]: 
matrix([[1, 3],
        [1, 3],
        [1, 3]])

在Python中,字符串或名称与其引用的对象之间存在着非常真实的差异。你知道吗

我怀疑构建Comblst更好的方法是:

In [1096]: 
      ...: Comblst = []
      ...: for i in range(0, len(Variables)+1):
      ...:   for subset in itertools.combinations(Variables, i):
      ...:     # a = str(subset).strip('()')
      ...:     Comblst.append(subset)
      ...:     
      ...:     
In [1097]: Comblst
Out[1097]: 
[(),
 ('sm01',),
 ('sm02',),
 ('sm03',),
 ('sm01', 'sm02'),
 ('sm01', 'sm03'),
 ('sm02', 'sm03'),
 ('sm01', 'sm02', 'sm03')]

In [1099]: Comblst[5]
Out[1099]: ('sm01', 'sm03')

忘记制作和分割字符串,而只是收集这些名称的元组。你知道吗

但您不必使用这些名称;您可以从矩阵本身的列表开始:

In [1101]: Mlist=[sm01, sm02, sm03]
In [1102]: 
      ...: Comblst = []
      ...: for i in range(0, len(Mlist)+1):
      ...:   for subset in itertools.combinations(Mlist, i):
      ...:     Comblst.append(subset)
      ...:     
In [1103]: Comblst
Out[1103]: 
[(), (matrix([[1],
          [1],
          [1]]),), (matrix([[2],
          [2],
          [2]]),), (matrix([[3],
          [3],
          ....
          [3]]))]
In [1104]: Comblst[5]
Out[1104]: 
(matrix([[1],
         [1],
         [1]]), matrix([[3],
         [3],
         [3]]))
In [1105]: np.hstack(Comblst[5])
Out[1105]: 
matrix([[1, 3],
        [1, 3],
        [1, 3]])

或者构造一个简单的数字元组列表,并用它建立索引

In [1109]: 
      ...: Comblst = []
      ...: for i in range(0, len(Mlist)+1):
      ...:   for subset in itertools.combinations( list(range(0, len(Mlist))), i):
      ...:     Comblst.append(subset)

In [1110]: Comblst
Out[1110]: [(), (0,), (1,), (2,), (0, 1), (0, 2), (1, 2), (0, 1, 2)]
In [1111]: Comblst[5]
Out[1111]: (0, 2)
In [1112]: np.hstack([Mlist[i] for i in Comblst[5]])
Out[1112]: 
matrix([[1, 3],
        [1, 3],
        [1, 3]])

相关问题 更多 >