3 回答

TA貢獻1815條經驗 獲得超13個贊
Y = np.array([[1,2,3],[4,5,6]])
這將創建一個 (2,3) 數組。
v = np.append(Y, [[7,8,9]], axis=0)
這實際上是實現為
v = np.concatenate(( Y, np.array([[7,8,9]]) ), axis=0)
也就是說,它將 (2,3) 數組與軸 0 上的 (1,3) 連接起來形成 (3,3)。
q = np.append(Y,[[9],[10]], axis=1)
在這里,它在軸 1 上將 (2,3) 與 (2,1) 連接起來,得到 (2,4)
np.concatenate
除非您指定,否則假定軸為 0。它不會嘗試猜測哪個軸有效或無效。在這種q
情況下使用軸 0 會導致錯誤。
還concatenate
需要匹配維度數量以及非連接軸上的匹配大小。嘗試類似的事情np.concatenate((Y, [2,1]))
看看我的意思。
我不喜歡np.append
,因為它看起來太像列表附加,并且給初學者帶來了很多問題。如果沒有軸,它就會破壞輸入(如果不明顯,請閱讀文檔和代碼)。concatenate
對于 axis,它與(再次閱讀代碼) 相同。concatenate
接受許多數組的列表,而不僅僅是 2。 np.append
人為地將操作限制為 2。
np.vstack
、np.hstack
、 和np.column_stack
是在調用 之前以各種方式調整輸入尺寸的變體concatenate
。它們補償了一些不匹配,例如連接行時:
np.vstack((Y, [7,8,9]))
在連接之前將 (3,) 數組轉換為 (1,3)。實際上,這是一種方便且安全的“事后猜測”。它很少會出現諸如 之類的問題np.append
。
numpy
(和 Python)試圖避免歧義。與再次猜測用戶相比,更有可能引發錯誤。發展的趨勢是消除允許“破壞規則”的遺留案例。

TA貢獻1817條經驗 獲得超14個贊
只是視覺上的補充:
# (3, 2) (3, 1)
#
# [[1, 4], | [[7],
# [2, 5], | [8],
# [3, 6]] | [9]],
# ---------
# [[7, 8]]
#
# (1, 2)
連接兩個數組時
數組必須具有相同的形狀,除了對應的維度axis
# (i, j0 , k)
# + (i, j1, k) # (concatenate)
# ---------------
# = (i, j0+j1, k)
你是對的,當將一維數組連接到二維數組時,軸參數應該足以明確地組合兩個數組,即使沒有維度匹配,但嵌套括號有助于使這一點更加明確,

TA貢獻1827條經驗 獲得超9個贊
append
與 非常相似concatenate
:它沿著現有軸合并兩個數組。括號是我們定義跨維度分布元素的方式。
Y
是形狀(2, 3)
。這意味著如果您想附加到第一個軸,額外的數據必須具有 shape (M, 3)
。如果要附加到第二個軸,新數據必須具有形狀(2, N)
。這可以推廣到任意數量的維度:新數組的所有維度(除了要附加的維度之外)都必須具有相同的形狀。
該數組[[7, 8, 9]]
具有M = 1
:其形狀為(1, 3)
,因此您可以將其附加到第一個軸就好了。這會向 . 添加額外的行Y
。如果您嘗試附加類似 的內容[[7], [8], [9]]
,則會收到錯誤,因為形狀現在是(3, 1)
。如果你嘗試這樣做,你最終不會得到一個統一的數組。
該數組[[9], [10]]
具有N = 1
:其形狀為(2, 1)
,因此您可以將其附加到第二個軸。這會向Y
. [[9, 10]]
有形狀(1, 2)
,所以顯然它不起作用。
axis
該關鍵字沒有為您提供足夠信息的原因是您并不總是附加單行或列。舉個例子:
np.append(Y, Y, axis=0) np.append(Y, Y, axis=1)
添加回答
舉報