簡體   English   中英

在 python 中編寫轉置向量

[英]Writing a Transpose a vector in python

我必須寫一個 python function 我需要計算向量 For A is n by n and xn is n by 1

r_n = Axn - (xn^TAxn)xn

我正在使用 numpy,但是 T 不適用於矢量,而當我只是這樣做時

r_n = A@xn - (xn@A@xn)@xnxn@A@xn給了我一個定標器。

我試過用 xn 更改 A 但似乎沒有任何效果。

像這樣制作一個 3x1 numpy 數組......

import numpy as np
       
a = np.array([1, 2, 3])

...然后嘗試像這樣進行轉置...

a_transpose = a.T

......令人困惑的是,會返回這個:

# [1 2 3]

如果你想定義一個(列)向量,你可以對其進行有意義的轉置,並得到一個行向量作為回報,你需要像這樣定義它:

a = np.reshape(np.array([1, 2, 3]), (3, 1))

print(a)

# [[1]
#  [2]
#  [3]]

a_transpose = a.T

print(a_transpose)

# [[1 2 3]]

如果你想定義一個1 xn數組,你可以對其進行轉置以獲得nx 1數組,你可以這樣做:

a = np.array([[1, 2, 3]])

然后通過調用aT獲得它的轉置。

如果A是 (n,n) 並且xn是 (n,1):

A@xn - (xn@A@xn)@xn

(n,n)@(n,1) - ((n,1)@(n,n)@(n,1)) @ (n,1)
(n,1)          error (1 does not match n)

如果xn@A@xn給出標量,那是因為xn是 (n,) 形狀; 根據np.matmul文檔,這是一個帶有兩個 1d arrays 的 2d

(n,)@(n,n)@(n,) => (n,)@(n,) -> scalar

我想你想要

(1,n) @ (n,n) @ (n,1) => (1,1)

想一想 (1,1) 數組應該是與標量相同的單個值。

樣本計算; 第一個 (n,) 形狀:

In [6]: A = np.arange(1,10).reshape(3,3); x = np.arange(1,4)

In [7]: A@x
Out[7]: array([14, 32, 50])    # (3,3)@(3,)=>(3,)

In [8]: x@A@x         # scalar
Out[8]: 228

In [9]: (x@A@x)@x
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[9], line 1
----> 1 (x@A@x)@x

ValueError: matmul: Input operand 0 does not have enough dimensions (has 0, gufunc core with signature (n?,k),(k,m?)->(n?,m?) requires 1)

matmul不喜歡使用標量。 但是我們可以改用np.dot ,或者簡單地相乘:

In [10]: (x@A@x)*x
Out[10]: array([228, 456, 684])     # (3,)

In [11]: A@x - (x@A@x)*x
Out[11]: array([-214, -424, -634])

將數組更改為 (3,1):

In [12]: xn = x[:,None]; xn.shape
Out[12]: (3, 1)

In [13]: A@xn - (xn.T@A@xn)*xn
Out[13]: 
array([[-214],
       [-424],
       [-634]])         # same numbers but in (3,1) shape

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM