Python 何时应该使用hstack/vstack vs append vs concatenate vs column\u stack?
简单的问题:每种方法的优点是什么。似乎在给定正确的参数(和ndarray形状)的情况下,它们看起来都是等效的。在适当的地方做一些工作?有更好的表现吗?在IPython中,您可以通过键入函数名,后跟Python 何时应该使用hstack/vstack vs append vs concatenate vs column\u stack?,python,numpy,Python,Numpy,简单的问题:每种方法的优点是什么。似乎在给定正确的参数(和ndarray形状)的情况下,它们看起来都是等效的。在适当的地方做一些工作?有更好的表现吗?在IPython中,您可以通过键入函数名,后跟?,查看函数的源代码。看看hstack,我们可以看到它实际上只是串联的包装(与vstack和列堆栈类似): 因此,我想只要使用听起来最符合逻辑的名称即可。所有函数都是用Python编写的,除了np.concatenate。对于IPython外壳,您只需使用? 如果没有,下面是他们的代码摘要: vstac
?
,查看函数的源代码。看看hstack
,我们可以看到它实际上只是串联
的包装(与vstack
和列堆栈
类似):
因此,我想只要使用听起来最符合逻辑的名称即可。所有函数都是用Python编写的,除了
np.concatenate
。对于IPython外壳,您只需使用?
如果没有,下面是他们的代码摘要:
vstack
concatenate([atleast_2d(_m) for _m in tup], 0)
i.e. turn all inputs in to 2d (or more) and concatenate on first
hstack
concatenate([atleast_1d(_m) for _m in tup], axis=<0 or 1>)
colstack
transform arrays with (if needed)
array(arr, copy=False, subok=True, ndmin=2).T
append
concatenate((asarray(arr), values), axis=axis)
也就是说,它扩展所有输入的DIM(有点像np.expand_dims
),然后连接。当轴=0时,效果与np.array
相同
hstack
文档现在添加了:
函数串联
,堆栈
和
块
提供更通用的堆叠和连接操作
np.block
也是新的。实际上,它是沿着嵌套列表递归连接的。numpy.vstack:按顺序垂直堆叠数组(行)。相当于np.concatenate(tup,axis=0)
示例请参见:
numpy.hstack:按顺序水平堆叠数组(按列)。相当于np.concatenate(tup,axis=1)
,但沿第一个轴串联的一维数组除外。示例见:
append是python内置数据结构list
的函数。每次向列表中添加元素时。显然,要添加多个元素,您将使用extend
。简单地说,numpy的功能要强大得多
例如:
假设gray.shape=(n0,n1)
np.vstack((灰色,灰色,灰色))
将具有形状(n0*3,n1),您也可以通过np.concatenate((灰色,灰色,灰色),axis=0)来实现它。
np.hstack((灰色,灰色,灰色))
将具有形状(n0,n1*3),您也可以通过np.concatenate((灰色,灰色,灰色),axis=1)来实现它。
np.dstack((灰色、灰色、灰色))
将具有形状(n0、n1、3)。如果有两个矩阵,最好只使用hstack
和vstack
:
np.hstack??
def hstack(tup):
...
arrs = [atleast_1d(_m) for _m in tup]
# As a special case, dimension 0 of 1-dimensional arrays is "horizontal"
if arrs[0].ndim == 1:
return _nx.concatenate(arrs, 0)
else:
return _nx.concatenate(arrs, 1)
arrays = [asanyarray(arr) for arr in arrays]
shapes = set(arr.shape for arr in arrays)
result_ndim = arrays[0].ndim + 1
axis = normalize_axis_index(axis, result_ndim)
sl = (slice(None),) * axis + (_nx.newaxis,)
expanded_arrays = [arr[sl] for arr in arrays]
concatenate(expanded_arrays, axis=axis, out=out)
如果要堆叠矩阵和向量,hstack
变得很难使用,因此column\u stack
是一个更好的选择:
如果要叠加两个向量,则有三个选项:
原始形式的串联
对于3D及以上版本非常有用,请参见
有关详细信息,请参阅我的文章。这篇文章非常有用!!