2017-06-15 311 views
2

我是新來的numpy, 所以,有numpy,有可能使用矩陣向量來得到向量矩陣「 例如:numpy:如何從矩陣向量構造向量矩陣

matrix1( 
[ 
[1, 2, 3], 
[1, 2, 3], 
[1, 2, 3] 
]) 

matrix2( 
[ 
[2, 4, 6], 
[2, 4, 6], 
[2, 4, 6] 
]) 

--> 

matrix( 
[ 
[array('1 2'), array('2 4'), array('3 6')], 
[array('1 2'), array('2 4'), array('3 6')], 
[array('1 2'), array('2 4'), array('3 6')] 
]) 

我是新來numpy的,所以我不知道這是否是允許把任何東西numpy的的矩陣或只是數字。 它不容易從谷歌得到的答案與類似的「矩陣描述矩陣的向量和向量「

+0

你確定你想要一個實際的NumPy _matrix_而不是一個2d或3d的'np.ndarray'嗎?主要區別在於NumPy矩陣的乘法遵循通常的線性代數規則,而如果將兩個兼容形狀的2d ndarrays相乘,則會得到一個元素乘法。如果你不是線性代數,那麼你幾乎肯定需要一個ndarray而不是矩陣。 –

+1

你試圖解決的大問題是什麼?你可以做很多與此大致相似的事情,但我懷疑這不是一個正確的問題。部分難題是numpy沒有將「矢量」概念與「矩陣」分開。它確實有「矩陣」和「陣列」的不同概念,但大多數人完全避免了矩陣表示。如果使用數組,則「矢量」,「矩陣」和「張量」的概念都歸入數組「形狀」屬性的一般概念之下。 – senderle

+0

@MarkDickinson我正在嘗試做元素明智的線性代數。也就是說,對於最終矩陣的一個元素,例如。 array('1 2'),我想將它乘到一個矩陣('1 0,0 1')並將其乘以另一個數組,例如,轉置(array('1 2')) – Hoohoo

回答

0

numpy沒有與」矩陣「分開的」向量「的概念。它確實h即「矩陣」和「陣列」的不同概念,但大多數人完全避免了矩陣表示。如果使用數組,則「矢量」,「矩陣」和「張量」的概念都歸入數組「形狀」屬性的一般概念之下。

在這個世界觀中,向量和矩陣都是二維數組,僅由它們的形狀來區分。行向量是形狀爲(1, n)的數組,而列向量是形狀爲(n, 1)的數組。矩陣是形狀爲(n, m)的陣列。一維數組有時可能會像向量一樣表現,這取決於上下文,但是經常會發現,除非您「升級」它們,否則您將無法獲得所需的內容。

記住這一切,下面是你的問題的一個可能的答案。首先,我們創建一個一維數組:

>>> a1d = numpy.array([1, 2, 3]) 
>>> a1d 
array([1, 2, 3]) 

現在我們重塑它以創建列向量。 -1這裏告訴numpy找出輸入的正確大小。

>>> vcol = a1d.reshape((-1, 1)) 
>>> vcol 
array([[1], 
     [2], 
     [3]]) 

觀察這個開頭和結尾的加括號。這是一個微妙的提示,這是一個二維陣列,即使一個維度的大小隻有1個。

我們可以做同樣的事情,交換維度,得到一個行。再次注意雙括號。

>>> vrow = a1d.reshape((1, -1)) 
>>> vrow 
array([[1, 2, 3]]) 

您可以知道這些是2- d陣列,因爲1-d陣列將在其shape元組只有一個值:

>>> a1d.shape 
(3,) 
>>> vcol.shape 
(3, 1) 
>>> vrow.shape 
(1, 3) 

爲了建立從我們可以列向量的矩陣使用hstack。還有很多其他方法可能會更快,但這是一個很好的起點。這裏請注意,[vcol]不是numpy對象,而是一個普通的python列表,因此[vcol] * 3的含義與[vcol, vcol, vcol]相同。

>>> mat = numpy.hstack([vcol] * 3) 
>>> mat 
array([[1, 1, 1], 
     [2, 2, 2], 
     [3, 3, 3]]) 

vstack給出了與行向量相同的結果。

>>> mat2 = numpy.vstack([vrow] * 3) 
>>> mat2 
array([[1, 2, 3], 
     [1, 2, 3], 
     [1, 2, 3]]) 

這是不可能的「從基質的載體構建載體矩陣」任何其他的解釋會產生你真正想要的東西numpy

既然你提到想要做線性代數,這裏有幾個可能的操作。這假定您使用的是Python的最新足夠版本來使用新的@運算符,該運算符爲數組的矩陣乘法提供了明確的內聯符號。

對於數組,乘法是總是元素明智。但有時候會有廣播。對於具有相同的形狀的值,這是顯而易見的逐元素乘法:

​​

當值具有不同的形狀,它們被廣播一起如果可能的話,以產生合理的結果:

>>> vrow * vcol 
array([[1, 2, 3], 
     [2, 4, 6], 
     [3, 6, 9]]) 
>>> vcol * vrow 
array([[1, 2, 3], 
     [2, 4, 6], 
     [3, 6, 9]]) 

廣播工作在你所期望的其它形狀的方法:

>>> vrow * mat 
array([[1, 2, 3], 
     [2, 4, 6], 
     [3, 6, 9]]) 
>>> vcol * mat 
array([[1, 1, 1], 
     [4, 4, 4], 
     [9, 9, 9]]) 

如果你想有一個點的產品,你必須使用@操作:

>>> vrow @ vcol 
array([[14]]) 

注意與*運營商,這是不是對稱的:

>>> vcol @ vrow 
array([[1, 2, 3], 
     [2, 4, 6], 
     [3, 6, 9]]) 

這可有點在第一混亂,因爲這看起來一樣vrow * vcol,但不要上當。無論參數順序如何,*都會產生相同的結果。最後,對於一個矩陣矢量乘積:

>>> mat @ vcol 
array([[ 6], 
     [12], 
     [18]]) 

再次觀察差@*之間:

>>> mat * vcol 
array([[1, 1, 1], 
     [4, 4, 4], 
     [9, 9, 9]]) 

1.不幸的是,這僅存在像Python 3.5。如果您需要使用較早的版本,則所有相同的建議都適用,除了使用a @ b的內嵌表示法之外,您必須使用np.dot(a, b)numpymatrix類型覆蓋*表現得像@ ...但你不能做元素方式乘法或廣播相同的方式!因此,即使您有較早版本,我也不建議使用matrix類型。