1 stack
numpy 中的stack可以将一组 array 沿着某一个axis 合成一个新的array, 这个函数接受两个输入参数, 一个是一组array,这一组中的所有array需要具有相同的shape, 另个参数就是 axis, 稍后解释个人理解的axis的意义。
stack的输出是一个新的array, 这个新的array 会比原来的那组array 增加新的一维。stack是根据前面的输入参数axis 来决定沿着哪一个axis 来合成新的array。 看几个具体的例子帮助理解。
import numpy as np
a=np.arange(1, 7).reshape((2, 3))
b=np.arange(7, 13).reshape((2, 3))
c=np.arange(13, 19).reshape((2, 3))
d=np.arange(19, 25).reshape((2, 3))
(array([[1, 2, 3],
[4, 5, 6]]),
array([[ 7, 8, 9],
[10, 11, 12]]),
array([[ 7, 8, 9],
[10, 11, 12]]),
array([[19, 20, 21],
[22, 23, 24]]))
我们要对上面提到的四个array 进行几个 axis=0,1,2,3 等不同维度进行组合实验
axis=0
x = np.stack([a,b,c,d], axis=0)
x
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]],
[[13, 14, 15],
[16, 17, 18]],
[[19, 20, 21],
[22, 23, 24]]])
前面提到np.stack会创建一个新的array, 这个array会比原来的array 增加新的一维, 这个增减的新的维就是第0维, [a,b,c,d]中有四个array, 所以输出的第0维的大小为4,那么输出的array的shape为423.
继续看看下面的例子:
axis=1
x = np.stack([a,b,c,d], axis=1)
x
array([[[ 1, 2, 3],
[ 7, 8, 9],
[13, 14, 15],
[19, 20, 21]],
[[ 4, 5, 6],
[10, 11, 12],
[16, 17, 18],
[22, 23, 24]]])
前面提到np.stack会创建一个新的array, 这个array会比原来的array 增加新的一维, 这个增减的新的维就是第1维, [a,b,c,d]中有四个array, 所以输出的第1维的大小为4,那么输出的array的shape为243.
axis=2
x = np.stack([a,b,c,d], axis=2)
x
array([[[ 1, 7, 13, 19],
[ 2, 8, 14, 20],
[ 3, 9, 15, 21]],
[[ 4, 10, 16, 22],
[ 5, 11, 17, 23],
[ 6, 12, 18, 24]]])
前面提到np.stack会创建一个新的array, 这个array会比原来的array 增加新的一维, 这个增减的新的维就是第2维, [a,b,c,d]中有四个array, 所以输出的第2维的大小为4,那么输出的array的shape为234.
axis=3
会直接报错的, 因为原来的array是2*3, 再增加1维, 那就是3维, 原来的array 是不不可能通过stack操作变成4维的。
x = np.stack([a,b,c,d], axis=3)
x
---------------------------------------------------------------------------
AxisError Traceback (most recent call last)
Cell In[40], line 1
----> 1 x = np.stack([a,b,c,d], axis=3)
2 x
File /data/anaconda3/yes/envs/jupyter/lib/python3.10/site-packages/numpy/core/shape_base.py:452, in stack(arrays, axis, out, dtype, casting)
449 raise ValueError('all input arrays must have the same shape')
451 result_ndim = arrays[0].ndim + 1
--> 452 axis = normalize_axis_index(axis, result_ndim)
454 sl = (slice(None),) * axis + (_nx.newaxis,)
455 expanded_arrays = [arr[sl] for arr in arrays]
AxisError: axis 3 is out of bounds for array of dimension 3
2 max
numpy 中的 max 函数接受一个array和axis, 表示沿着axis来取最大值。这样输出的结果应该比原来array小1维, 看看下面的例子。
import numpy as np
a=np.arange(1, 7).reshape((2, 3))
b=np.arange(7, 13).reshape((2, 3))
c=np.arange(13, 19).reshape((2, 3))
d=np.arange(19, 25).reshape((2, 3))
d[0][0] = -13
x = np.stack([a,b,c,d], axis=0)
y = np.max(x, axis=0)
y
array([[13, 20, 21],
[22, 23, 24]])
这个例子先将23的四个array 合成一个 423的一个array, 然后沿着axis=0取最大值, 数据结果变成一个23的array.