下面是寻找超立方体矩阵的一个看似简单的递归.

递归定义为:

(Formula)

我试着把它转换成代码,但我总是遇到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.

我收到此错误^^

推荐答案

使用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.]

Python相关问答推荐

如何将ctyles.POINTER(ctyles.c_float)转换为int?

删除任何仅包含字符(或不包含其他数字值的邮政编码)的观察

运行终端命令时出现问题:pip start anonymous"

发生异常:TclMessage命令名称无效.!listbox"

如何在类和classy-fastapi -fastapi- followup中使用FastAPI创建路由

Python中绕y轴曲线的旋转

Python解析整数格式说明符的规则?

Python—从np.array中 Select 复杂的列子集

用砂箱开发Web统计分析

无法连接到Keycloat服务器

如何在达到end_time时自动将状态字段从1更改为0

如何创建引用列表并分配值的Systemrame列

OpenGL仅渲染第二个三角形,第一个三角形不可见

提高算法效率的策略?

在极点中读取、扫描和接收有什么不同?

为什么在Python中00是一个有效的整数?

我怎么才能用拉夫分拣呢?

Polars时间戳同步延迟计算

是否需要依赖反转来确保呼叫方和被呼叫方之间的分离?

如何在不不断遇到ChromeDriver版本错误的情况下使用Selify?