【问题标题】:How to create a function that concatenates a variable number of matrices?如何创建一个连接可变数量矩阵的函数?
【发布时间】:2018-05-28 22:35:52
【问题描述】:

我想创建一个python函数来连接几个矩阵这是两个矩阵的例子:

def create_matrix(number,rows,columns):
    matrix=np.full((rows,columns),number)
    return matrix

matrix1=create_matrix(0,1,2)
matrix2=create_matrix(1,1,3)
matrix3=create_matrix(2,1,4)

def concatenate_matrix(matrix1,matrix2):
    vector_pacient=np.hstack((matrix1,matrix2))
    return vector_pacient

print(concatenate_matrix(matrix1,matrix2))
print('result',concatenate_matrix(matrix1,matrix2).shape) 

这对我得到的两个矩阵非常有效:

[[0 0 1 1 1]]
result shape (1, 5)

如我所愿,现在我想连接可变数量的矩阵,我试过了:

def concatenate_matrix2(*args):
    for arg in args:
        print(arg.shape)
        vector_pacient=np.hstack(arg)
    return vector_pacient
print(concatenate_matrix2(matrix1,matrix2,matrix3))
print(concatenate_matrix2(matrix1,matrix2,matrix3).shape)

但是我得到了:

(1, 2)
(1, 3)
(1, 4)
[2 2 2 2]
(1, 2)
(1, 3)
(1, 4)
result shape (4,)

我不明白错误在哪里,它的形状应该是:

(1,9)

还有一个矩阵如下:

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

因此,我希望得到修复我的代码的建议。

【问题讨论】:

  • 为什么不直接将数组列表传递给concatenatestack 变体之一?
  • np.concatenate((matrix1, matrix2, matrix3), axis=1)

标签: python-3.x numpy matrix keyword-argument


【解决方案1】:

您的for 循环存在错误。您似乎想要执行以下操作:

def concatenate_matrix2(*args):
    vector_pacient = args[0]
    for i in range(1, len(args)):
        vector_pacient = np.hstack((vector_pacient, args[i]))
    return vector_pacient

或更简洁地说:

def concatenate_matrix2(*args):
    return np.hstack(args)

也可以:

def concatenate_matrix2(*args):
    return np.concatenate(args, axis=1)

(...仅当所有矩阵的尺寸(除了连接轴)完全匹配时才有效 - 它在这里有效,因为尺寸 0 具有相同的尺寸 1)

【讨论】:

    【解决方案2】:

    为了好玩,也作为一种更快的替代方法,为什么不创建一个“空”连接数组,然后简单地用数据填充它?

    concat = np.empty((1, 9), dtype=np.int)
    matrix1 = concat[0, :2]
    matrix2 = concat[0, 2:5]
    matrix3 = concat[0, 5:]
    
    matrix1[:] = 0
    matrix2[:] = 1
    matrix3[:] = 2
    

    当然这可以“自动化”:

    from itertools import accumulate
    sl = ((2, 0), (3, 1), (4, 2)) # define lengths of sections and values
    cnt = [0] + list(accumulate(i[0] for i in sl))
    for k, (i, j) in enumerate(zip(cnt[:-1], cnt[1:])):
        concat[0, i:j] = sl[k][1]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      • 2020-06-26
      • 1970-01-01
      • 2017-03-13
      • 2019-11-09
      相关资源
      最近更新 更多