首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取影响原始数组的二维numpy阵列对角线

获取影响原始数组的二维numpy阵列对角线
EN

Stack Overflow用户
提问于 2020-08-05 21:13:57
回答 5查看 474关注 0票数 2

我有一个二维的数字阵列。我想通过创建其对角线元素的数组并修改对角线数组来修改它,以便这些更改反映原来的2D数组。

我试过:

代码语言:javascript
复制
>>> a = np.ones(shape=(3,3))
>>> d1 = a[np.diag_indices_from(a)]
>>> d1
array([1., 1., 1.])
>>> d1[0] = 2
>>> d1
array([2., 1., 1.])
>>>a
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])

可以看出,这些更改不影响原始数组。

是否有任何方法来创建一个对角线数组,也将影响原始的2D数组?

编辑:当我处理行或列时,我得到了我想要的效果:

代码语言:javascript
复制
>>> row0 = a[0]
>>> row0[0] = 0
>>> a
array([[0., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])
>>> column0=a[:,0]
>>> column0[2]=3
>>> a
array([[0., 1., 1.],
       [1., 1., 1.],
       [3., 1., 1.]])
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2020-08-05 23:43:31

您可以使用np.einsum精确地获得所需的内容:

。。增加的版本: 1.10.0 当输入数组可写时,einsum返回的视图现在是可写的。例如,np.einsum('ijk...->kji...', a)现在将具有与:py:func:np.swapaxes(a, 0, 2) <numpy.swapaxes>np.einsum('ii->i', a)相同的效果,将返回2D数组对角线的可写视图。

代码语言:javascript
复制
a = np.ones((3,3))
b = np.einsum("ii->i",a)
b[:] = 2,3,4
a
# array([[2., 1., 1.],
#        [1., 3., 1.],
#        [1., 1., 4.]])
票数 3
EN

Stack Overflow用户

发布于 2020-08-05 21:19:14

当您这样索引(花式索引)时,您就是获取副本而不是视图。您只需要将d1重新分配给a,就像定义它一样

代码语言:javascript
复制
a = np.ones(shape=(3,3))
d1 = a[np.diag_indices_from(a)]
d1[0] = 2
a[np.diag_indices_from(a)] = d1
票数 2
EN

Stack Overflow用户

发布于 2020-08-05 22:02:39

正确的方法是使用np.diagonalnp.fill_diagonal。下面还添加了一种扭曲numpy的方法:

代码语言:javascript
复制
a = np.ones(shape=(3,3))
d1 = np.diagonal(a).copy()
d1[0] = 2
np.fill_diagonal(a,d1)

产出:

代码语言:javascript
复制
a

[[2. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]

注意,基于np.diagonal:从NumPy 1.9开始,它返回原始数组上的只读视图。试图写入结果数组将产生错误。在将来的某个版本中,它将返回一个读/写视图,而对返回的数组的写入将改变您的原始数组。返回的数组将具有与输入数组相同的类型。

为了扭转numpy,您可以这样做,但我建议使用上面的解决方案:

代码语言:javascript
复制
a = np.ones(shape=(3,3))
d1 = np.diagonal(a)
d1.setflags(True)
d1[0] = 2
np.fill_diagonal(a,d1)

产出:

代码语言:javascript
复制
a

[[2. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63273599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档