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)
。 numpy
的matrix
類型覆蓋*
表現得像@
...但你不能做元素方式乘法或廣播相同的方式!因此,即使您有較早版本,我也不建議使用matrix
類型。
你確定你想要一個實際的NumPy _matrix_而不是一個2d或3d的'np.ndarray'嗎?主要區別在於NumPy矩陣的乘法遵循通常的線性代數規則,而如果將兩個兼容形狀的2d ndarrays相乘,則會得到一個元素乘法。如果你不是線性代數,那麼你幾乎肯定需要一個ndarray而不是矩陣。 –
你試圖解決的大問題是什麼?你可以做很多與此大致相似的事情,但我懷疑這不是一個正確的問題。部分難題是numpy沒有將「矢量」概念與「矩陣」分開。它確實有「矩陣」和「陣列」的不同概念,但大多數人完全避免了矩陣表示。如果使用數組,則「矢量」,「矩陣」和「張量」的概念都歸入數組「形狀」屬性的一般概念之下。 – senderle
@MarkDickinson我正在嘗試做元素明智的線性代數。也就是說,對於最終矩陣的一個元素,例如。 array('1 2'),我想將它乘到一個矩陣('1 0,0 1')並將其乘以另一個數組,例如,轉置(array('1 2')) – Hoohoo