亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

numpy的轉置方法無法將一維行ndarray轉換為第一列

numpy的轉置方法無法將一維行ndarray轉換為第一列

一只名叫tom的貓 2022-06-28 15:46:02
讓我們考慮a一個一維行/水平數組:import numpy as npN = 10a = np.arange(N) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])a.shape # (10,)現在我想要b一個一維列/垂直數組轉置a:b = a.transpose() # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])b.shape # (10,)但該.transpose()方法返回一個完全相同的ndarray,形狀完全相同!我期望看到的是np.array([[0], [1], [2], [3], [4], [5], [6], [7], [8], [9]])這可以通過c = a.reshape(a.shape[0], 1) # or c = a; c.shape = (c.shape[0], 1)c.shape # (10, 1)令我驚訝的是,它的形狀是 ,(10, 1)而不是(1, 10)。在 Octave/Scilab 我可以這樣做:N = 10b = 0:(N-1)a = b'size(b) % ans = 1   10size(a) % ans = 10   1我知道 numpy ndarrays 不是矩陣(如此處所討論的),但是 numpy 的轉置函數的行為對我來說沒有意義!如果您能幫助我了解這種行為的意義以及我在這里缺少什么,我將不勝感激。PS所以到目前為止我所理解b = a.transpose()的是b = a; b.shape = b.shape[::-1],如果你有一個“二維數組”,(N, 1)它將返回一個(1, N)整形數組,正如你對轉置運算符所期望的那樣。但是,numpy 似乎將“一維數組”(N,)視為 0D 標量。我認為他們應該將此方法命名為其他名稱,因為這非常具有誤導性/令人困惑的恕我直言。
查看完整描述

2 回答

?
泛舟湖上清波郎朗

TA貢獻1818條經驗 獲得超3個贊

簡而言之,numpy ndarrays 有這個屬性叫做 stride,也就是

要在內存中跳過以繼續到下一個元素的字節數。例如,對于 (10, 10) 字節數組,步長可能是 (10, 1),換句話說:前進一個字節以到達下一列,前進 10 個字節以定位下一行。

對于您的 ndarray a,a.stride(8,),這表明它只是一維的,并且要到達該一維上的下一個元素,您需要在內存中提前 8 個字節(每個 int 是 64 位)。

步幅對于表示轉置很有用:

例如,通過修改步幅,可以零成本轉置或重塑數組(無需復制內存)。

因此,如果有一個二維 ndarray,b = np.ones((3,5))例如,然后b.strides(40, 8),而b.transpose().strides(8, 40)。因此,如您所見,轉置的 2D-ndarray 只是完全相同的數組,其步幅已重新排序。而且由于您的一維 ndarray 只有一維,因此交換其步幅的值(即取其轉置)不會做任何事情。


查看完整回答
反對 回復 2022-06-28
?
慕蓋茨4494581

TA貢獻1850條經驗 獲得超11個贊

正如您已經提到的,numpy 數組不是矩陣。轉置函數的定義如下


置換數組的維度。


這意味著 numpy 的轉置方法會將數據從一個維度移動到另一個維度。由于一維數組只有一個維度,因此沒有其他維度可以移動數據 t0。所以你需要在轉置有任何效果之前添加一個維度。這種行為對于與更高維數組(3D、4D ...)數組保持一致也是有意義的。


有一種干凈的方法可以實現您想要的


N = 10

a = np.arange(N)

a[ :, np.newaxis]


查看完整回答
反對 回復 2022-06-28
  • 2 回答
  • 0 關注
  • 296 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號