[英]numpy column arrays and strange results
我正在嘗試編寫一個函數,其參數是具有不同形狀的數組。 我有一些麻煩來理解列數組並使我的函數適用於所有形狀的數組,這里是我發現的問題:
轉置:如果參數數組A
不是向量,那么我可以使用AT
很好地轉置它,但是如果A
是行向量,則不會將A
轉換為列向量。 如果A
是列向量,這將(奇怪地)將其轉換為行向量。 有沒有辦法獨立於其形狀轉置數組?
點乘積帶有標量的列向量的點乘積是列向量(是啊!)。 具有1個元素numpy數組的列向量的點Product是行向量(nayyy)。
A = array((1,2)).reshape(2,1) #this is how I make a column vector (is there a better looking way?)
print dot(A,3) #column vector
b = dot(array((2,4)),a) #array with shape (1,)
print dot(A,b) #row vector..(bah)
逆溫
linalg.inv(array(2)) #gives an error, shouldn't it return 1/2 ?
感謝您的幫助! PS對不起是菜鳥我習慣了Matlab這種寫東西的方式對我來說很混亂.. PS2我不想使用矩陣因為數組比較一般
如果你已經習慣了Matlab,那么Numpy處理“列”和“行”向量的方式有點奇怪。 要意識到的是,1-d數組既不是列也不是行向量。 要成為列或行向量,數組必須是2維數組,其中一個維度設置為1 。 您可以通過查看有多少個大括號來區分一維數組和一行二維數組:
>>> a = numpy.arange(15)
>>> a
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
>>> b = a.reshape(1, -1)
>>> b
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]])
現在您可以看到,當您轉置這兩個時, a
保持不變,但b
成為列向量:
>>> a.T
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
>>> b.T
array([[ 0],
[ 1],
[ 2],
[ 3],
[ 4],
[ 5],
[ 6],
[ 7],
[ 8],
[ 9],
[10],
[11],
[12],
[13],
[14]])
同樣,這看起來有點奇怪 - 但正如你所說,“數組更通用。” 為了實現這種普遍性,Numpy嚴格區分不同維度的數組; 在任何有意義的意義上,1-d數組都不能是“列”或“行”向量。 第二個維度根本沒有定義!
您的其他問題的答案來自此觀察。 你上面的代碼示例代碼為我生成了一個錯誤,所以我會做一些稍微不同的事情......這也會產生一個錯誤,但是信息更豐富:
>>> A
array([[1],
[2]])
>>> B
array([2, 4])
>>> numpy.dot(A, B)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: objects are not aligned
Numpy抱怨對象沒有對齊。 那是因為B是1-d陣列! 讓它成為一個真正的行向量:
>>> B = B.reshape(1, -1)
>>> B
array([[2, 4]])
>>> numpy.dot(A, B)
array([[2, 4],
[4, 8]])
>>> numpy.dot(B, A)
array([[10]])
現在一切都有道理。 Dot只是在這里執行矩陣乘法; 按一個順序,該操作產生一個2x2陣列; 另一方面,它產生一個1x1陣列。 注意大括號的數量! 這兩個都是二維數組。 反過來, 10
, [10]
和[[10]]
都會有不同的結果。
同樣,請考慮以下三個值:
>>> numpy.array(2)
array(2)
>>> numpy.array((2,))
array([2])
>>> numpy.array((2,)).reshape(1,-1)
array([[2]])
如果你將這些傳遞給numpy.linalg.inv
,你會得到除了最后一個之外的所有錯誤 - 你不能采用不是矩陣的矩陣逆矩陣! 如果你傳遞最后一個,結果也是一個矩陣:
>>> numpy.linalg.inv(numpy.array((2,)).reshape(1,-1))
array([[ 0.5]])
區分一維陣列和二維陣列很重要。 您指的行向量是1D,而列向量是2D。 為了證明這種差異,請看下面的例子。
首先,我們演示了轉置2D數組的默認行為(即使列向量是一個簡單的2D數組):
import numpy as np
print np.ones((3, 4)).T.shape
print np.ones((3, 1)).T.shape
輸出是 - 正如預期的那樣:
(4, 3)
(1, 3)
但是,1D向量不會改變其大小:
print np.ones((3,)).T.shape
輸出:
(3,)
要快速將其轉換為2D數組,請使用[:,None]
:
print np.ones((3,))[:,None].T.shape
輸出:
(1, 3)
要獲得所需的結果,最好使用2D數組:
A = np.ones((2, 1) # column vector
b = np.ones((1, 1)) # scalar
print np.dot(A, b) # column vector (as expected)
輸出:
[[ 1.]
[ 1.]]
是啊! :)
同樣,您需要確保使用2D數組。 這可以使用ndmin
參數完成:
print np.linalg.inv(np.array(2,ndmin=2))
輸出:
[[ 0.5]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.