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

2024-06-06 18:22:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我想取一个数组的行和,把输出放到另一个数组的对角线上。出于性能原因,我想使用np.sum函数的out参数。你知道吗

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.]])

当然,下面的方法是有效的,但是我想使用outnp.sum参数

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

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

有人能解释一下out参数不接受数组的对角线索引作为有效输出的行为吗?你知道吗


Tags: 参数npzeros数组out性能arraydiag
1条回答
网友
1楼 · 发布于 2024-06-06 18:22:36

NumPy有两种类型的索引:基本索引和高级索引。你知道吗

基本索引是指当索引表达式仅使用整数、片、...None(又称np.newaxis)时发生的情况。这完全可以通过对偏移量和步长的简单操作来实现,因此当基本索引返回数组时,生成的数组总是原始数据的视图。写入视图将写入原始数组。你知道吗

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

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

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


我们现在应该已经能够使用np.diagonal了,但是尽管文档中说np.diagonal的输出在numpy1.10中是可写的,但是使其可写的相关特性是still in limbo。最好不要使用out参数:

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

相关问题 更多 >