Numpy добавление двумерных массивов вместе - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь создать функцию, которая возводит в степень двумерную матрицу и сохраняет результат в трехмерном массиве, где первое измерение индексирует показатель степени. Это важно, потому что строки матрицы, которую я возводил в степень, представляют информацию о различных вершинах графа. Так, например, если у нас есть A, A ^ 2, A ^ 3, каждый из них имеет форму (50,50), и я хочу матрицу D = (3,50,50), чтобы я мог перейти к D [:, 1,:], чтобы получить всю информацию об узле 1 и иметь возможность умножения матрицы с этим. Мой код в настоящее время имеет вид

def expo(times,A,n):
    temp = A;
    result = csr_matrix.toarray(temp)
    for i in range(0,times):
        temp = np.dot(temp,A)
        if i == 0:
            result = np.array([result,csr_matrix.toarray(temp)]) # this creates a (2,50,50) array
        if i > 0:
            result = np.append(result,csr_matrix.toarray(temp),axis=0) # this does not work
    return result

Однако это не работает, потому что в случае «i> 0» временный массив имеет форму (50,50) и не может быть добавлен. Я не уверен, как заставить это работать, и я довольно смущен размерностью в Numpy, например, почему мысли (50,1) иногда и просто (50,) другие времена. Сможет ли кто-нибудь помочь мне заставить этот код работать и объяснить, как все это нужно делать в Numpy?

1 Ответ

0 голосов
/ 10 октября 2019

Ссылка на документацию

Если вы хотите сложить матрицы в numpy, вы можете использовать функцию stack . Если вы также хотите, чтобы индекс соответствовал показателю степени, вы можете добавить матрицу единиц в начало вывода:

MWE

import numpy as np

def expo(A, n):
    result =[np.eye(len(A)), A,]
    for _ in range(n-1):
        result.append(result[-1].dot(A))

    return np.stack(result, axis=0) 
    # If you do not really need the 3D array, 
    # you could also just return the list


result = expo(np.array([[1,-2],[-2,1]]), 3)
print(result)
# [[[  1.   0.]
#   [  0.   1.]]
#
#  [[  1.  -2.]
#   [ -2.   1.]]
#
#  [[  5.  -4.]
#   [ -4.   5.]]
#
#  [[ 13. -14.]
#   [-14.  13.]]]

print(result[1])
# [[ 1. -2.]
#  [-2.  1.]]

Комментарии

Как видите, мы сначала просто создаем список матриц, а затем в конце преобразуем их в массив. Я не уверен, действительно ли вам нужен 3D-массив, поскольку вы также можете просто проиндексировать созданный список, но это зависит от вашего варианта использования, удобно это или нет.

Полагаю, что аргумент ключевого слова axis для многих непонятных функций поначалу может сбить с толку, но в документации, как правило, есть хорошие примеры, которые в сочетании с теми же методами проб и ошибок, должны довольно далеко увести вас. Например, для numpy.stack самый первый пример - это именно то, что вы хотите сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...