Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将numpy函数的输出放入数组的对角线中_Python_Arrays_Numpy - Fatal编程技术网

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

Python 将numpy函数的输出放入数组的对角线中,python,arrays,numpy,Python,Arrays,Numpy,我想取一个数组的行和,并将输出放在另一个数组的对角线上。出于性能原因,我想使用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.,

我想取一个数组的行和,并将输出放在另一个数组的对角线上。出于性能原因,我想使用
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.]])
当然,下面的方法是有效的,但是我想使用
np.sum的
out
参数

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

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

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

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

基本索引是指当索引表达式仅使用整数、切片、
..
(也称为
np.newaxis
)时发生的情况。这完全可以通过对偏移量和跨距的简单操作来实现,因此,当基本索引返回数组时,生成的数组始终是原始数据的视图。写入视图会写入原始数组

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

np.sum(mat1, axis=1, out = mat3[np.diag_indices(2)])
数据被放置到副本中,但原始数组不受影响


到目前为止,我们本应该能够使用
np.diagonal
,但尽管文档中说
np.diagonal
的输出在NumPy 1.10中是可写的,但使其可写的相关功能是。最好不要为此使用
out
参数:

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

谢谢你的详细解释。不能使用
out
参数真是太遗憾了。这真的可以帮我省去很多头痛!