查看到一个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。 当你需要在大型数组上进行某种操作时,这是非常好的,但是…对于如何解释内存缓冲区,您有低级控制权。