在NumPy中,为什么hstack()
从正在堆叠的数组中复制数据:
A, B = np.array([1,2]), np.array([3,4])
C = np.hstack((A,B))
A[0]=99
给出C
:
array([1, 2, 3, 4])
而hsplit()
在数据上创建视图:
a = np.array(((1,2),(3,4)))
b, c = np.hsplit(a,2)
a[0][0]=99
给出b
:
array([[99],
[ 3]])
我的意思是-这种行为的实现背后的原因是什么(我发现不一致和难以记住):我接受这种情况的发生,因为它是这样编码的…
基本上底层的narray数据结构只有一个指向其数据内存开始的指针,然后关于如何通过每个维度移动的跨行信息。如果连接两个数组,它将不知道如何从一个内存位置移动到另一个内存位置。另一方面,如果将数组拆分为两个数组,则每个数组都可以轻松地存储指向第一个元素的指针(该元素位于原始数组的某个位置)。
基本的C实现在这里,这里有一个很好的讨论:
http://scipy-lectures.github.io/advanced/advanced_numpy/index.html life-of-ndarray
NumPy通常会尽可能地创建视图,因为内存复制效率很低,而且会很快占用大量的周期。
hsplit
将输入数组拆分为多个输出数组。每个输出数组都可以被视为原始父数组的一部分(因为它们基本上都是简单的切片)。因此,为了提高效率,NumPy创建视图,而不是复制。
hstack
将两个完全独立的数组组合成一个输出数组。底层数组实现不能处理单个数组中的两个独立数据源,因此无法与原始数组共享数据。因此,NumPy被迫创建一个副本。