Ниже приведена, казалось бы, простая рекурсия для поиска матрицы гиперкуба.
Рекурсия определяется как:
Я пытался поместить это в код, но постоянно сталкиваюсь с проблемами трансляции с 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.
Я получаю эту ошибку ^^
@AndrejKesely Хорошо, я добавил это
Множество предыдущих SO об ошибке inhomogeneous
. Вы пытаетесь создать «рваный» массив, что-то смешанной формы.
Используйте 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.]
Не могли бы вы отредактировать свой вопрос и описать возникшие у вас проблемы? Есть ли сообщения об ошибках/обратная трассировка?