垂直和水平连接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】:这是一种使用hstack
和vstack
的方法:
>>> 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函数vsplit垂直(行角度)拆分numpy数组(返回拆分后的numpy数组列表)实战:垂直拆分二维numpy数组split函数垂直拆分二维numpy数组