簡體   English   中英

數組([2,1])是 1 行和 2 列還是 2 行和 1 列?(在 python numpy 中)

[英]Is array([2,1]) 1 row & 2 cols or 2 rows & 1 col?(In python numpy)

在 python 庫 numpy 中,是 array([2,1]) (1,2) 還是 (2,1)_(row,col)?

我在下面嘗試了 3 次,但找不到答案。

import numpy as np

x = np.array([1,2])
y = np.array([[1,3,5], [2,4,6]])
z = np.array([[1,2],[3,4],[5,6]])
o = np.array([1,2,3])

print(np.dot(x,y))
print(np.dot(z,x))
print(np.dot(x,o))

第一個和第二個有效,但最后一個沒有。 錯誤是:-

ValueError: shapes (2,) and (3,) not aligned: 2 (dim 0) != 3 (dim 0)

在我看來,在案例 1 中,x =(1 行和 2 列)在案例 2 中,x =(2 行和 1 列)在案例 3 中,x 應該是(2 行和 1 列)但它沒有工作

請讓我知道為什么會這樣。

In [272]: x = np.array([1,2])
     ...: y = np.array([[1,3,5], [2,4,6]])
     ...: z = np.array([[1,2],[3,4],[5,6]])
     ...: o = np.array([1,2,3])
     ...: 
In [273]: x.shape
Out[273]: (2,)              # 1 element tuple
In [274]: y.shape
Out[274]: (2, 3)            # 2 element tuple
In [275]: z.shape
Out[275]: (3, 2)
In [276]: o.shape
Out[276]: (3,)

尺寸的行/列解釋適合 2 arrays 像yz xo不匹配。

我們可以從x制作一個 2d 數組,其中有一個明確的行,2 列:

In [277]: x[None,:].shape
Out[277]: (1, 2)

但對於許多用途,(2,) 形狀與 (1,2) 形狀一樣有效。

np.dot有關於它如何處理 1d arrays 的詳細記錄的規則。

基本規則是在 A 的最后一個點和 B 的第二個到最后一個點上執行乘積之和,並留有 1d 的余量。

x, y   (2,) with (2,3) => (3,)  (the 2's pair)
z, x   (3,2) with (2,) => (3,)  (the 2's pair)
x, o  (2,) with (3,)  no match!

A (n,2) 將與 (2,3) 打點以產生 (n,3) 結果。 同樣,帶有 (2,n) 的 (3,2) 會產生 (3,n)。

這是學習numpy時的“黃金”規則:應用形狀兼容性規則時,永遠不要考慮行和列。

話雖如此,這里是np.dot(a,b)的形狀兼容性規則(此處編號項目符號的形式復制)

  1. 如果 a 和 b 都是一維 arrays,則它是向量的內積(沒有復共軛)。
  2. 如果 a 和 b 都是二維 arrays,則為矩陣乘法,但首選使用 matmul 或 a@b。
  3. 如果 a 或 b 為 0-D(標量),則等效於乘法,並且首選使用 numpy.multiply(a, b) 或 a * b。
  4. 如果 a 是 ND 數組且 b 是一維數組,則它是 a 和 b 的最后一個軸上的和積。
  5. 如果 a 是 ND 數組且 b 是 MD 數組(其中 M>=2),則它是 a 的最后一個軸和 b 的倒數第二個軸的和積

(請注意,沒有任何規則以表示。它們僅以 arrays ab尺寸表示)

在我們的例子中:

x是具有2元素的一維數組(或“向量”)。

y是形狀為(2,3)的二維數組。

z是形狀為(3,2)的二維數組。

o是具有3元素的一維數組(或“向量”)。

對於np.dot(x,y) ,規則(5)適用。

對於np.dot(z,x) ,規則(4)適用。

對於np.dot(x,o) , rule(1) 被嘗試,但失敗了,因為你不能做一個包含2元素的向量與另一個包含3元素的向量的內積。 (兩個向量需要具有相同數量的元素)

我不確定您的問題是什么,當您有 (X,) X 表示元素數量並且 (X,Y) 是 x 行和 Y 列時

x.shape -> (2,) 2 elements
o.shape -> (3,) 3 elements
y.shape -> (2, 3) 2 rows 3 cols
z.shape -> (3, 2) 3 rows 2 cols

所以np.dot(x,o)會給你一個錯誤

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<__array_function__ internals>", line 6, in dot
ValueError: shapes (2,) and (3,) not aligned: 2 (dim 0) != 3 (dim 0)

暫無
暫無

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

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