连接Numpy数组而不复制
在Numpy中,我可以使用np.append
或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]])
但是这些复制了他们的input数组:
>>> Z[0,:] = 0 >>> Z array([[ 0, 0, 0], [-1, -2, -3], [ 4, 5, 6]]) >>> X array([[1, 2, 3]])
有没有办法将两个数组连接成一个视图 ,即不复制? 那需要一个np.ndarray
子类吗?
属于Numpy数组的内存必须是连续的。 如果你分开分配数组,它们会随机分散在内存中,并且无法将它们表示为一个Numpy数组。
如果您事先知道需要多less个数组,您可以从事先分配的一个大数组开始,并将每个小数组作为大数组的视图(例如通过切片获得)。
在填充数据之前,只需初始化数组。 如果你想要,你可以分配更多的空间,而不会占用更多的内存,因为numpy的工作方式。
A = np.zeros(R,C) A[row] = [data]
内存仅在数据放入数组后才使用。 从两个连接创build一个新的数组将永远不会完成任何大小的数据集,即数据集> 1GB左右。
不是很优雅,但你可以使用一个元组来存储指向数组的指针。 现在我不知道如何使用它,但我之前做过这样的事情。
>>> X = np.array([[1,2,3]]) >>> Y = np.array([[-1,-2,-3],[4,5,6]]) >>> z = (X, Y) >>> z[0][:] = 0 >>> z (array([[0, 0, 0]]), array([[-1, -2, -3], [ 4, 5, 6]])) >>> X array([[0, 0, 0]])
你可以创build一个数组的数组,如:
>>> from numpy import * >>> a = array([1.0, 2.0, 3.0]) >>> b = array([4.0, 5.0]) >>> c = array([a, b]) >>> c array([[ 1. 2. 3.], [ 4. 5.]], dtype=object) >>> a[0] = 100.0 >>> a array([ 100., 2., 3.]) >>> c array([[ 100. 2. 3.], [ 4. 5.]], dtype=object) >>> c[0][1] = 200.0 >>> a array([ 100., 200., 3.]) >>> c array([[ 100. 200. 3.], [ 4. 5.]], dtype=object) >>> c *= 1000 >>> c array([[ 100000. 200000. 3000.], [ 4000. 5000.]], dtype=object) >>> a array([ 100., 200., 3.]) >>> # Oops! Copies were made...
问题是它在广播操作上创build副本(听起来像一个bug)。