查看numpy阵列?

NPE*_*NPE 86 python numpy scikits

我有一个2D numpy数组.有没有办法在其上创建包含第一k行和所有列的视图?

关键是要避免复制基础数据(数组太大,以至于无法制作部分副本.)

Joe*_*ton 216

当然,只需像往常一样索引它.例如,y = x[:k, :] 这将返回原始数组的视图.不会复制任何数据,并且y将反映所做的任何更新x,反之亦然.


编辑:

我通常使用> 10GB的uint8的3D阵列,所以我很担心这个...如果你记住一些事情,Numpy在内存管理方面非常有效.以下是避免在内存中复制数组的一些提示:

使用+=,-=,*=等,以避免使数组的一个副本.例如,x += 10将在适当的位置修改数组,同时x = x + 10将复制并修改它.(另外,看看numexpr)

如果您确实想要复制x = x + 10,请注意这x = x + 10.0将导致x自动升级到浮点数组(如果尚未升级).但是,x += 10.0x整数数组中,将导致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>)将返回一个视图.

但请注意这一点......它非常强大且有用,但您需要了解底层数据如何存储在内存中.如果你有一个浮点数组,并将它们视为整数,(反之亦然),numpy会将数组的基础解释为整数.

例如,这意味着1.0当小端系统上的64位浮点数被4607182418800017408视为64位int时,以及[ 0, 0, 0, 0, 0, 0, 240, 63]如果被视为uint8 的数组.当你需要在大型数组上进行某种类型的操作时,这非常好,但是......你对内存缓冲区的解释方式有低级别的控制.

  • @wuhaochi如果b是a的视图,则b.base是a就是True。一个副本(任何数组)将始终具有`arr_copy.base为None`。 (2认同)