簡體   English   中英

numpy列數組和奇怪的結果

[英]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.

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