查看numpy阵列?

时间:2010-12-06 20:41:45

标签: python numpy scikits

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

重点是避免复制基础数据(数组太大,以至于无法制作部分副本。)

1 个答案:

答案 0 :(得分:213)

当然,只需像往常一样对其进行索引。例如。 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.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>)将返回一个视图。

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

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