代码之家  ›  专栏  ›  技术社区  ›  KDX2

numpy的vstack是否创建了一个新数组——它组合的数组的副本?

  •  3
  • KDX2  · 技术社区  · 6 年前

    我正在编写一些函数,这些函数沿着目录树遍历,在目录树中按名称对文件进行排序,并在表中编码它们和更多信息。

    我将此表定义为numpy vstack数组。 一开始,它向数组中添加条目的速度非常快,但当它达到大约20000个条目时,速度会慢很多。如此之多,要达到这个目标,大约需要9万行人口,大约需要10分钟。

    我非常怀疑vstack是罪魁祸首,因为它可能正在复制整个表+我要附加到它的行。 官方的numpy文档说vstacking只不过是“串联”…但这并不能回答我的问题。

    因此,np.vstack()是否查看它将要粘合在一起的数组的大小,然后错误定位所需的内存并复制我们正在堆叠的数组的内容?

    更新: 就统计数据而言,女士们先生们,使用列表将执行时间提高到了0.5秒,这比以前快了20倍多,实际上甚至比这还要慢,因为我的度量包括了一些额外的操作。

    1 回复  |  直到 6 年前
        1
  •  4
  •   abcdaire    6 年前

    你是对的, np.vstack 复制完整数组。

    您可以做一个小的python体验来确认它:

    a = np.array([[1,2,3]])
    b = np.array([[4,5,6]])
    res = np.vstack((a,b))
    res
    array([[1, 2, 3],
           [4, 5, 6]])
    

    然后,如果修改数组 a 打印分辨率,你可以看到 res 是 未修改

    a[0,2] = 19
    res
    array([[1, 2, 3],
           [4, 5, 6]])