【问题标题】:Concatenating numpy arrays vertically and horizontally垂直和水平连接numpy数组
【发布时间】: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 吗?

【问题讨论】:

    标签: arrays python-2.7 numpy concatenation


    【解决方案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。但是,我正在做的项目是针对大学课程,我们必须在其中尝试使用刮刀/爬虫。幸运的是,性能超出了作业的范围 :) 感谢您的意见 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      • 2014-03-20
      • 2021-12-19
      • 1970-01-01
      • 2013-06-19
      相关资源
      最近更新 更多