Как создать функцию, которая объединяет переменное число матриц? - PullRequest
0 голосов
/ 29 мая 2018

Я хотел бы создать функцию 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]]

Поэтому я хотел бы поблагодарить за предложения по исправлению моего кода.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Для удовольствия, а также в качестве альтернативы, которая также может быть быстрее, почему бы не создать «пустой» каскадный массив, а затем просто заполнить его данными?

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]
0 голосов
/ 29 мая 2018

Произошла ошибка в вашем цикле 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)

...