如果我和3×4阵列开始,并连接一个3×1阵列,其中轴1,得到了一个3×5阵列:
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,)形状 - 这是一维,并因此错误:
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
的作品。而不是一个列表,它需要2个参数。它模仿列表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
首先确保所有的输入都atleast_1d
,然后它串联:
return np.concatenate([np.atleast_1d(a) for a in arrs], 1)
所以它需要同x[:,-1:]
输入。基本上是同一个动作。
np.column_stack
也做在轴上1.一个串连但首先通过它
array(arr, copy=False, subok=True, ndmin=2).T
通过1D输入本是转动该(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
是很重要的。也知道如何查找这样的函数的代码。我使用了很多魔术。
而在时间测试中,np.concatenate
明显更快 - 这样一个小型数组,多余的函数调用层次会产生很大的时间差异。
尝试'np.column_stack'。 – Divakar
它的工作!但为什么? – odo22