查看到一个numpy数组?

我有一个2D numpy数组。 有没有一种方法可以创build一个包含前k行和所有列的视图?

重点在于避免复制底层数据(数组太大以至于不能部分复制)。

当然,就像平常那样索引它。 例如y = x[:k, :]这将返回一个视图到原始数组中。 没有数据将被复制,任何对y更新都将反映在x ,反之亦然。


编辑:

我通常使用uint8的> 10GB三维数组,所以我很担心这个问题。如果你记住一些事情,Numpy可以在内存pipe理方面非常高效。 以下是避免在内存中复制数组的一些技巧:

使用+=-=*=等避免复制数组。 例如, x += 10会修改arrays,而x = x + 10会复制并修改它。 (另外,看看一个numexpr )

如果你想用x = x + 10进行复制,请注意x = x + 10.0会导致x被自动上传到浮点数组(如果还没有的话)。 但是, x += 10.0 ,其中x是一个整数数组,将导致10.0向下转换为与数组相同精度的int值。

另外,很多numpy函数都带out一个out参数,所以你可以像np.abs(x, x)那样np.abs(x, x)的绝对值。


作为第二个编辑,下面是关于视图与numpy数组拷贝的技巧:

不像python列表, y = x[:]不返回一个副本,它返回一个视图。 如果你确实需要一个副本(当然这会增加你使用的内存量),使用y = x.copy()

你会经常听到关于numpy数组的“奇特索引”。 使用列表(或整数数组)作为索引是“幻想索引”。 这可能是非常有用的,但复制数据。

作为一个例子: y = x[[0, 1, 2], :] y = x[:3,:]返回一个副本,而y = x[:3,:]会返回一个视图。

即使像x[4:100:5, :-10:-1, None]这样的疯狂索引是“正常”的索引,并且会返回一个视图,所以不要害怕在大的时候使用各种切片技巧arrays。

x.astype(<dtype>)将返回数据的一个副本作为新types,而x.view(<dtype>)将返回一个视图。

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

例如,这意味着当作为一个64位整数时,在一个小端系统上的64位浮点数将是4607182418800017408如果查看的话,一个数组[ 0, 0, 0, 0, 0, 0, 240, 63] 4607182418800017408 [ 0, 0, 0, 0, 0, 0, 240, 63]作为一个uint8。 当你需要在大型数组上进行某种操作时,这是非常好的,但是…对于如何解释内存缓冲区,您有低级控制权。