在使用numpy進行矩陣運算的時候踩到的坑,緣由是不能正確區分numpy.concatenate和numpy.stack在功能上的差別。html
先說numpy.concatenate,直接看文檔:python
numpy.
concatenate
((a1, a2, ...), axis=0, out=None)
git
Join a sequence of arrays along an existing axis.github
The arrays must have the same shape, except in the dimension corresponding to axis (the first, by default).數組
The axis along which the arrays will be joined. If axis is None, arrays are flattened before use. Default is 0.dom
If provided, the destination to place the result. The shape must be correct, matching that of what concatenate would have returned if no out argument were specified.ide
The concatenated array.this
重點在這一句:在一個已經存在的維度上鍊接數組列。可見numpy.concatenate能夠同時鏈接好幾個數組,而且不會生成新的維度: along an existing axis。示例以下:spa
>>> a = np.array([[1, 2], [3, 4]]) >>> b = np.array([[5, 6]]) >>> np.concatenate((a, b), axis=0) array([[1, 2], [3, 4], [5, 6]]) >>> np.concatenate((a, b.T), axis=1) array([[1, 2, 5], [3, 4, 6]]) >>> np.concatenate((a, b), axis=None) array([1, 2, 3, 4, 5, 6])
再說numpy.stack:code
numpy.
stack
(arrays, axis=0, out=None)
Join a sequence of arrays along a new axis.
The axis
parameter specifies the index of the new axis in the dimensions of the result. For example, if axis=0
it will be the first dimension and if axis=-1
it will be the last dimension.
New in version 1.10.0.
Each array must have the same shape.
The axis in the result array along which the input arrays are stacked.
If provided, the destination to place the result. The shape must be correct, matching that of what stack would have returned if no out argument were specified.
The stacked array has one more dimension than the input arrays.
和concatenate不一樣的是,stack Joins a sequence of arrays along a new axis.也就是說stack會生成一個新的維度。並且stack適用的條件很強,數組序列必須所有有相同的shape。用例子來講明,使用最多的大概是在第0維stack:
>>> arrays = [np.random.randn(3, 4) for _ in range(10)] # arrays是一個長度爲10的List,每個元素都是(3,4)的ndarray >>> np.stack(arrays, axis=0).shape (10, 3, 4) >>> np.stack(arrays, axis=1).shape (3, 10, 4) >>> np.stack(arrays, axis=2).shape (3, 4, 10)
一個清晰的區別是返回的數組比輸入數組多了一維。