将numpy函数的输出放入数组的对角线

时间:2016-01-28 17:57:37

标签: python arrays numpy

我想获取一个数组的行和,并将输出放入另一个数组的对角线。出于性能原因,我想使用out函数的np.sum参数。

mat1 = np.array([[0.5, 0.5],[0.6, 0.4]])

mat2 = np.zeros([2,2])

mat3 = np.zeros([2,2])

如果我想将mat1的行总和放入mat2的第一行,我可以这样做:

np.sum(mat1, axis=1, out = mat2[0])

mat2
#array([[ 1.,  1.],
#       [ 0.,  0.]])

但是,如果我想将总和放入mat3对角线索引,我似乎无法这样做。

np.sum(mat1, axis=1, out = mat3[np.diag_indices(2)])

mat3
#array([[ 0.,  0.],
#       [ 0.,  0.]])

当然,以下工作,但我想使用out的{​​{1}}参数

np.sum

有人可以解释mat3[np.diag_indices(2)] = np.sum(mat1, axis=1) mat3 #array([[ 1., 0.], # [ 0., 1.]]) 参数的这种行为不接受数组的对角线索引作为有效输出吗?

1 个答案:

答案 0 :(得分:2)

NumPy有两种索引类型:基本索引和高级索引。

当索引表达式仅使用整数,切片,...None(a.k.a。np.newaxis)时,会发生基本索引。这可以通过简单的偏移和步幅操作来实现,因此当基本索引返回数组时,结果数组始终是原始数据的视图。写入视图会写入原始数组。

使用数组进行索引时,如mat3[np.diag_indices(2)]中所示,您将获得高级索引。高级索引不能以返回原始数据视图的方式完成;它始终复制来自原始数组的数据。这意味着当您尝试将副本用作out参数时:

np.sum(mat1, axis=1, out = mat3[np.diag_indices(2)])

数据被放入副本中,但原始数组不受影响。

我们原本应该有能力使用np.diagonal,但即使文档说np.diagonal的输出在NumPy 1.10中是可写的,使其可写的相关功能是still in limbo。最好不要使用out参数:

mat3[np.diag_indices(2)] = np.sum(mat1, axis=1)