我有一个二维的数字阵列。我想通过创建其对角线元素的数组并修改对角线数组来修改它,以便这些更改反映原来的2D数组。
我试过:
>>> 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数组?
编辑:当我处理行或列时,我得到了我想要的效果:
>>> 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.]])发布于 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数组对角线的可写视图。
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.]])发布于 2020-08-05 21:19:14
发布于 2020-08-05 22:02:39
正确的方法是使用np.diagonal和np.fill_diagonal。下面还添加了一种扭曲numpy的方法:
a = np.ones(shape=(3,3))
d1 = np.diagonal(a).copy()
d1[0] = 2
np.fill_diagonal(a,d1)产出:
a
[[2. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]注意,基于np.diagonal:从NumPy 1.9开始,它返回原始数组上的只读视图。试图写入结果数组将产生错误。在将来的某个版本中,它将返回一个读/写视图,而对返回的数组的写入将改变您的原始数组。返回的数组将具有与输入数组相同的类型。
为了扭转numpy,您可以这样做,但我建议使用上面的解决方案:
a = np.ones(shape=(3,3))
d1 = np.diagonal(a)
d1.setflags(True)
d1[0] = 2
np.fill_diagonal(a,d1)产出:
a
[[2. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]https://stackoverflow.com/questions/63273599
复制相似问题