【问题标题】:Assinging submatrix to matrix in numpy [duplicate]在numpy中将子矩阵分配给矩阵[重复]
【发布时间】:2020-11-06 22:46:46
【问题描述】:

我写了一些代码来计算 householder 减少到 Hessenberg form

V = []
m,n = A.shape
for i in range(m-1):
    x = A[i+1:,i]
    e1 = np.zeros(x.shape)
    e1[0] = 1
    v = sgn(x[0])*np.linalg.norm(x)*e1 + x  
    v = v/np.linalg.norm(v)
    V.append(v) 
    vv = np.outer(v,v)
    print(A[i+1:,i:]-2*vv @ A[i+1:,i:])
    A[i+1:,i:] =A[i+1:,i:]-2*vv @ A[i+1:,i:]
    print(A)
    A[:,i+1:] = A[:,i+1:] - 2 *  np.outer(A[:,i+1:] @ v,v)

我使用 A =

运行此代码
[[1,2,3],
 [2,4,5],
 [1,3,2]]

第一个打印语句打印

[[-2.23606798 -4.91934955 -5.36656315]
 [ 0.          0.89442719 -0.4472136 ]]

这是有道理的。 而第二个打印出来

[[ 1  2  3]
 [-2 -4 -5]
 [ 0  0  0]]

这没有意义。

为什么它们的打印方式不同? 如果这种分配不起作用,还有其他聪明的方法吗?

【问题讨论】:

  • 什么是 sgn - 我们无法运行您的代码 - 请阅读 minimal reproducible example。也许您可以将示例简化为一些简单的任务 - 查看您的代码应该可以工作。
  • 我用这个A矩阵得到了RuntimeWarning: invalid value encountered in true_divide v = v/np.linalg.norm(v),我把A改成了np.array([[1,2,3], [2.5,4,5], [1,3,2]]),结果看起来很正常。
  • 看起来你的问题是:How do I assign floats to an array of ints 或类似的东西。我想在 SO 或文档中有答案。

标签: python numpy


【解决方案1】:

您正在尝试将浮点数分配给整数数组。这是一个快速修复 - 在操作之前更改 dtype。

A = np.array([[1,2,3],
              [2,4,5],
              [1,3,2]])

b = np.array([[-2.23606798, -4.91934955, -5.36656315],
              [ 0.,          0.89442719, -0.4472136 ]])

A = A.astype('float64')
A[1:,0:] = b

print(A)

>>>
[[ 1.          2.          3.        ]
 [-2.23606798 -4.91934955 -5.36656315]
 [ 0.          0.89442719 -0.4472136 ]]
>>> 

来自the documentation 关于索引/分配:

请注意,如果将较高类型分配给较低类型(例如将浮点数分配给整数)甚至是异常(将复数分配给浮点数或整数),则分配可能会导致更改:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多