为什么hstack()复制数据,而hsplit()在数据上创建视图?



在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被迫创建一个副本。

最新更新