查看numpy阵列?

我有一个2D
numpy
数组。有没有办法在其上创建包含第一个
k
行和所有列的视图? 关键是要避免复制基础数据(数组太大,以至于无法制作部分副本。)     
已邀请:
当然,只需像往常一样索引它。例如。
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会将数组的基础位解释为整数。 例如,这意味着在小端系统上作为64位浮点数的
1.0
在被视为64位int时将是
4607182418800017408
,如果被视为uint8则是
[  0,   0,   0,   0,   0,   0, 240,  63]
的数组。当你需要在大型数组上进行某种类型的操作时,这非常好,但是......你对内存缓冲区的解释方式有低级别的控制。     

要回复问题请先登录注册