You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

numpy.kron计算复矩阵克罗内克积时出现异常非零相位问题

问题

使用numpy.kron计算单位矩阵Id与随机复矩阵rand_complex的克罗内克积时,发现本应无相位的非对角块区域出现了非零相位。推测这可能是numpy.angle依赖反正切函数导致的数值不稳定问题,想了解该问题是否已知,或是在使用numpy.kron处理复值输入时存在操作疏漏?

复现代码

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

Id = np.identity(3)
ones_real = np.ones((2,2))
rand_complex = np.random.uniform(-1, 1, (2,2)) + 1.j * np.random.uniform(-1, 1, (2,2))

# 计算克罗内克积
kron_real = np.kron(Id, ones_real)
kron_complex = np.kron(Id, rand_complex)

# 可视化结果
fig2, ax = plt.subplots(3, 1, figsize=(10, 20))
sns.heatmap(kron_real, ax=ax[0])
sns.heatmap(np.abs(kron_complex), ax=ax[1])
sns.heatmap(np.angle(kron_complex), ax=ax[2])
plt.show()
解答
  • 这不是numpy.kron的操作疏漏,而是浮点数数值精度与numpy.angle计算逻辑共同导致的已知现象。
  • 克罗内克积的非对角块区域理论上是零矩阵,但浮点数运算的精度限制会让这些位置产生极接近0的微小复数(实部和虚部通常在1e-16量级),而非严格的0。
  • numpy.angle通过np.arctan2(imag, real)计算相位,哪怕实部虚部都是极小值,只要不为严格0,就会输出一个随机的相位值(因为微小值的正负符号是随机的)。
  • 解决方法:
    • 对结果做阈值截断:将绝对值小于某个极小阈值(如1e-15)的元素强制设为0,再计算相位。示例代码:
      # 截断微小值
      kron_complex[np.abs(kron_complex) < 1e-15] = 0
      # 重新计算并可视化相位
      sns.heatmap(np.angle(kron_complex), ax=ax[2])
      
    • 可视化时忽略极小值对应的区域,或用掩码标记这些位置。

内容的提问来源于stack exchange,提问作者Blupon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:55:05