垂直和水平连接numpy数组

Posted

技术标签:

【中文标题】垂直和水平连接numpy数组【英文标题】:Concatenating numpy arrays vertically and horizontally 【发布时间】:2014-04-19 20:44:06 【问题描述】:

我有一个 numpy 多维数组数组,格式如下:

a  = [[1,2],
      [8,9]]

然后我想添加一个包含 3 个值的列表(例如 [4,5,6] 在水平和垂直的末尾,结果如下:

a = [[1,2,4],
     [8,9,5],
     [4,5,6]]

我需要以某种方式组合 row_stack 和 column_stack 吗?

【问题讨论】:

【参考方案1】:

这是一种使用hstackvstack的方法:

>>> a  = [[1,2],
...       [8,9]]
>>> x = np.array([4, 5, 6])

>>> b = np.vstack((a, x[:-1]))
>>> print np.hstack((b, x[:, None]))
[[1 2 4]
 [8 9 5]
 [4 5 6]]

你可以把它合并成一行:

>>> print np.hstack((np.vstack((a, x[:-1])), x[:, None]))
[[1 2 4]
 [8 9 5]
 [4 5 6]]

【讨论】:

【参考方案2】:

不确定是否有更好的方法(即单线),但您可以这样做:

z = np.zeros((3,3))
z[:2,:2] = a
z[:,2] = z[2,:] = array([4, 5, 6])

【讨论】:

这只有在你知道最终产品有多大的情况下才有效,我猜。我需要能够使用 for 循环来继续扩展矩阵。 @Chielt 就像注释一样,以这种方式扩展数组非常慢,因为您每次都必须将整个数组复制到内存中。使用这种技术迭代地填充它,然后修剪它可能会更好。 @Ophion,问题在于数组是不同对象之间的距离矩阵。添加新对象时,会计算并存储新对象(和每个现有对象)之间的距离。由于关系是双向的,因此需要垂直和水平存储值。由于将添加的对象数量未知,因此最大可能大小实际上是无限的。 @Chielt 不知道你需要多久扩展一次数组,或者它的成本有多高,但你可以用类似的方式来做,例如Java 的 ArrayList 做到了(除非我弄错了):从一些小尺寸开始,当它变得太大时,将尺寸加倍。 这听起来像是一个不错的解决方案@tobias_k。但是,我正在做的项目是针对大学课程,我们必须在其中尝试使用刮刀/爬虫。幸运的是,性能超出了作业的范围 :) 感谢您的意见 :)

以上是关于垂直和水平连接numpy数组的主要内容,如果未能解决你的问题,请参考以下文章

Python 水平垂直连接矩阵/数组

垂直连接两个 NumPy 数组

垂直连接两个NumPy数组

连接/附加多个不同大小的垂直数组

Python使用numpy函数vsplit垂直(行角度)拆分numpy数组(返回拆分后的numpy数组列表)实战:垂直拆分二维numpy数组split函数垂直拆分二维numpy数组

数组的拼接