如何正确连接两个一维数组而不展平?

Posted

技术标签:

【中文标题】如何正确连接两个一维数组而不展平?【英文标题】:How to properly concatenate two 1D arrays without flattening? 【发布时间】:2019-12-01 09:06:14 【问题描述】:

如何正确连接两个 numpy 向量而不使结果变平?使用 append 时这一点非常明显,但使用 numpy 时会变得非常混乱。

我已经尝试过连接(显式轴而不是显式轴)、hstack、vstack。都没有结果。

In [1]: a
Out[1]: array([1, 2, 3])

In [2]: b
Out[2]: array([6, 7, 8])

In [3]: c = np.concatenate((a,b),axis=0)

In [4]: c
Out[4]: array([1, 2, 3, 6, 7, 8])

请注意,如果 ab 是列表而不是 numpy 数组,则上面的代码确实有效。 我想要的输出:

Out[4]: array([[1, 2, 3], [6, 7, 8]])

编辑

vstack 确实适用于ab,如上所示。它不适用于我的现实生活案例,我想用某个维度的向量迭代地填充一个空数组。

hist=[]
for i in range(len(filenames)):
    fileload = np.load(filenames[i])
    maxarray.append(fileload['maxamp'])

    hist_t, bins_t = np.histogram(maxarray[i], bins=np.arange(0,4097,4))
    hist = np.vstack((hist,hist_t))

解决方案:

我找到了解决方案:您必须正确初始化数组,例如:How to add a new row to an empty numpy array

【问题讨论】:

np.array([a,b]) 你可以使用vstack, np.vstack([a, b]) 使用hist.append(hist_t)。您的解决方案链接显示列表附加更快。 【参考方案1】:

要让np.concatenate 在这里工作,输入数组应该有两个维度,因为这里不是沿着第二个轴串联,输入数组只有一维。

您可以在此处使用np.vstack,如docs 中所述:

相当于将形状为 (N,) 的一维数组重新整形为 (1,N) 后沿第一个轴进行串联

a = np.array([1, 2, 3])
b = np.array([6, 7, 8])

np.vstack([a, b])

array([[1, 2, 3],
       [6, 7, 8]])

【讨论】:

这确实适用于上面的 a 和 b。但在我的现实生活中却不是这样:我有一个空数组,我想用相同维度的数组填充 iterativelt。我稍后会编辑 OP。 @deppep 迭代地增长一个数组无论如何都是一个坏主意。与列表不同,数组不是为调整大小而设计的;这样做涉及完全重新分配 + 复制,因此迭代方案将具有二次复杂度(列表:线性)。

以上是关于如何正确连接两个一维数组而不展平?的主要内容,如果未能解决你的问题,请参考以下文章

Python计算两个numpy数组的交集(Intersection)实战:两个输入数组的交集并排序获取交集元素及其索引如果输入数组不是一维的,它们将被展平(flatten),然后计算交集

如何按希尔伯特曲线的顺序将二维矩阵(n x n)展平为一维数组?

在 PHP 中将多维关联数组展平为一维引用数组

使用rest参数将参数展平为一维数组

你可以从两个 np.float 一维数组创建一个 np.complex128 一维数组而不复制吗?

android 能不能在array文件里定义二维数组而不单单是一维数组