如果我从一个3x4的数组开始,并在轴1上连接一个3x1的数组,我将得到一个3x5的数组:
In [911]: x = np.arange(12).reshape(3,4)
In [912]: np.concatenate([x,x[:,-1:]], axis=1)
Out[912]:
array([[ 0, 1, 2, 3, 3],
[ 4, 5, 6, 7, 7],
[ 8, 9, 10, 11, 11]])
In [913]: x.shape,x[:,-1:].shape
Out[913]: ((3, 4), (3, 1))
请注意,连接操作的两个输入都有2个维度。
省略冒号
:
,
x[:,-1]
的形状为(3,) - 它是1维的,因此会出现错误。
In [914]: np.concatenate([x,x[:,-1]], axis=1)
...
ValueError: all the input arrays must have same number of dimensions
np.append
的代码是(在指定轴的情况下)
return concatenate((arr, values), axis=axis)
所以稍微改变语法,
append
就可以使用了。它不再接受列表作为参数,而是需要两个参数。它模仿了列表的
append
语法,但不应与那个列表方法混淆。
In [916]: np.append(x, x[:,-1:], axis=1)
Out[916]:
array([[ 0, 1, 2, 3, 3],
[ 4, 5, 6, 7, 7],
[ 8, 9, 10, 11, 11]])
np.hstack
首先确保所有输入都至少是一维的,然后执行连接操作:
return np.concatenate([np.atleast_1d(a) for a in arrs], 1)
因此,它需要相同的 x[:,-1:]
输入。本质上是相同的操作。
np.column_stack
也在轴1上进行连接。但首先它会将1d输入通过。
array(arr, copy=False, subok=True, ndmin=2).T
这是将(3,)数组转换为(3,1)数组的通用方法。
In [922]: np.array(x[:,-1], copy=False, subok=True, ndmin=2).T
Out[922]:
array([[ 3],
[ 7],
[11]])
In [923]: np.column_stack([x,x[:,-1]])
Out[923]:
array([[ 0, 1, 2, 3, 3],
[ 4, 5, 6, 7, 7],
[ 8, 9, 10, 11, 11]])
所有这些“堆栈”可能很方便,但从长远来看,了解维度和基础np.concatenate
是非常重要的。还要知道如何查找此类函数的代码。我经常使用ipython
??
魔法指令。
在时间测试中,np.concatenate
明显更快 - 对于像这样的小数组,额外的函数调用层会产生很大的时间差异。
np.column_stack
。 - Divakar