连接Numpy数组而不复制

Fre*_*Foo 68 python numpy multidimensional-array

在Numpy中,我可以使用np.appendor 连接两个端到端的数组np.concatenate:

>>> X = np.array([[1,2,3]])
>>> Y = np.array([[-1,-2,-3],[4,5,6]])
>>> Z = np.append(X, Y, axis=0)
>>> Z
array([[ 1,  2,  3],
       [-1, -2, -3],
       [ 4,  5,  6]])
Run Code Online (Sandbox Code Playgroud)

但是这些会复制他们的输入数组:

>>> Z[0,:] = 0
>>> Z
array([[ 0,  0,  0],
       [-1, -2, -3],
       [ 4,  5,  6]])
>>> X
array([[1, 2, 3]])
Run Code Online (Sandbox Code Playgroud)

有没有办法将两个数组连接到视图中,即没有复制?那需要一个np.ndarray子类吗?

pv.*_*pv. 68

属于Numpy数组的内存必须是连续的.如果分别分配数组,它们会随机分散在内存中,并且无法将它们表示为视图Numpy数组.

如果您事先知道需要多少个数组,则可以先从一个预先分配的大数组开始,然后让每个小数组成为大数组的视图(例如通过切片获得).

  • 不一致的评论:视图的内存不必是连续的,但它可能必须以固定的步幅排序(对于数组列表也不是这种情况). (9认同)
  • 是的,子类也必须遵守Numpy的内存模型.(@ cyborgs上面的评论也是正确的:子阵列也可以在内存中以固定的步幅排序,但也可以通过事先安排事情来获得.)仔细阅读[本页](http:// docs. scipy.org/doc/numpy/reference/arrays.ndarray.html#internal-memory-layout-of-an-ndarray)可能会有更多的亮点. (3认同)

Joh*_*ohn 10

只需在填充数据之前初始化数组.如果你想要你可以分配比所需更多的空间,并且由于numpy的工作方式它不会占用更多的RAM.

A = np.zeros(R,C)
A[row] = [data]
Run Code Online (Sandbox Code Playgroud)

只有将数据放入阵列后才使用内存.通过连接两个来创建一个新数组永远不会在任何大小的数据集上完成,即数据集> 1GB左右.