1 回答
TA贡献1790条经验 获得超9个赞
当然,只需像平常一样索引它即可。例如,y = x[:k, :]
这将使视图返回原始数组。不会复制任何数据,对其所做的任何更新都y
将反映在其中x
,反之亦然。
编辑:
我通常使用uint8的大于10GB的3D阵列,因此我对此非常担心...如果记住一些事项,Numpy可以非常有效地进行内存管理。以下是一些避免在内存中制作数组副本的提示:
使用+=
,-=
,*=
等,以避免使数组的一个副本。例如,x += 10
将在适当位置修改数组,同时x = x + 10
将复制并修改它。(另外,看看numexpr)
如果您确实想使用进行复制x = x + 10
,请注意,这x = x + 10.0
将导致x
将其自动转换为浮点数组(如果尚未复制)。但是,x += 10.0
在哪里,x
是一个整数数组,它将导致10.0
向下转换为与该数组相同精度的int。
此外,许多numpy函数都带有一个out
参数,因此您可以执行一些操作,例如np.abs(x, x)
获取x
就地的绝对值。
作为第二个编辑,这是关于视图和具有numpy数组的副本的其他一些技巧:
与python列表不同,y = x[:]
它不返回副本,而是返回视图。如果您确实想要一个副本(当然,它将使您正在使用的内存量增加一倍),请使用y = x.copy()
您会经常听到有关numpy数组的“花式索引”的信息。使用列表(或整数数组)作为索引是“花式索引”。它可能非常有用,但是可以复制数据。
例如:y = x[[0, 1, 2], :]
返回一个副本,同时y = x[:3,:]
返回一个视图。
即使是真正疯狂的索引,也x[4:100:5, :-10:-1, None]
都是“正常”索引,尽管如此,它会返回一个视图,所以不要害怕在大型数组上使用各种切片技巧。
x.astype(<dtype>)
将以新类型x.view(<dtype>)
返回数据的副本,而将返回视图。
但是,请务必小心……它非常强大且有用,但是您需要了解基础数据如何存储在内存中。如果您有一个浮点数组,并将其视为int,则numpy会将数组的基础位解释为int。
例如,这意味着当被视为64位int时,1.0
将在little-endian系统上作为64位浮点数4607182418800017408
,[ 0, 0, 0, 0, 0, 0, 240, 63]
如果被视为uint8 ,则将被视为数组。但是,当您需要在大型阵列上进行某种位纠缠时,这确实非常好。...您对内存缓冲区的解释方式具有较低级别的控制。
添加回答
举报