Рекурсивное построение матрицы с проблемами с массивами (трансляция?)

Ниже приведена, казалось бы, простая рекурсия для поиска матрицы гиперкуба.

Рекурсия определяется как:

(Формула)

Я пытался поместить это в код, но постоянно сталкиваюсь с проблемами трансляции с numpy.

Я попробовал вместо размера предыдущей матрицы просто взять степень 2, чтобы уменьшить количество рекурсивных вызовов (для параметра единичной матрицы).

import numpy as np
from numpy import linalg as LA

Q1 = np.array([[0, 1],
               [1, 0]])

def Qn(n):
    if n <= 1:
        return Q1
    else:
        return np.array([[Qn(n-1), np.identity(int(np.exp2(n-1)))],
                         [np.identity(int(np.exp2(n-1))), Qn(n-1)]])
    
Q3= Qn(3)

eig_value, eig_vectors = LA.eig(Q3)
print(eig_value)

Q1 — базовый вариант моей матрицы. Это должно быть очень просто, но я продолжаю сталкиваться с проблемами.

Traceback (most recent call last):
File "e:\Coding\Python\test.py", line 15, in <module>
Q3= Qn(3)
File "e:\Coding\Python\test.py", line 12, in Qn
return np.array([[Qn(n-1), np.identity(int(np.exp2(n-1)))],
ValueError: setting an array element with a sequence. The 
requested array has an inhomogeneous shape after 2 dimensions. The 
detected shape was (2, 2) + inhomogeneous part.

Я получаю эту ошибку ^^

Не могли бы вы отредактировать свой вопрос и описать возникшие у вас проблемы? Есть ли сообщения об ошибках/обратная трассировка?

Andrej Kesely 01.03.2024 10:19

@AndrejKesely Хорошо, я добавил это

mo-alowais 01.03.2024 13:41

Множество предыдущих SO об ошибке inhomogeneous. Вы пытаетесь создать «рваный» массив, что-то смешанной формы.

hpaulj 01.03.2024 14:30
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте np.block вместо np.array, чтобы собрать блочную матрицу.

import numpy as np
from numpy import linalg as LA

Q1 = np.array([[0, 1],
               [1, 0]])

def Qn(n):
    if n <= 1:
        return Q1
    else:
        Qnm1 = Qn(n-1)
        I = np.eye(2**(n-1))
        return np.block([[Qnm1, I], [I, Qnm1]])
    
Q3 = Qn(3)

eig_value, eig_vectors = LA.eig(Q3)
print(eig_value)
# [ 3. -3. -1. -1. -1.  1.  1.  1.]

Другой вариант, используя np.r_/np.c_:

import numpy as np
from numpy import linalg as LA

Q1 = np.array([[0, 1], [1, 0]])


def Qn(n):
    if n <= 1:
        return Q1
    else:
        I = np.eye(2 ** (n - 1))
        Qnm1 = Qn(n - 1)
        return np.r_[np.c_[Qnm1, I], np.c_[I, Qnm1]]


Q3 = Qn(3)

eig_value, eig_vectors = LA.eig(Q3)
print(eig_value)

Распечатки:

[ 3. -3. -1. -1. -1.  1.  1.  1.]

Другие вопросы по теме