NumPy数组索引2D矩阵

Mat*_*ijn 5 python numpy

在处理相同的大数据时,我遇到了一些问题.但是现在,让我们假设我有一个填充零的NumPy数组

>>> x = np.zeros((3,3))
>>> x
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])
Run Code Online (Sandbox Code Playgroud)

现在我想用特定值更改其中一些零.我已经给出了我想要改变的细胞的索引.

>>> y = np.array([[0,0],[1,1],[2,2]])
>>> y 
array([[0, 0],
       [1, 1],
       [2, 2]])
Run Code Online (Sandbox Code Playgroud)

我有一个包含所需(现在随机)数字的数组,如下所示

>>> z = np.array(np.random.rand(3))
>>> z
array([ 0.04988558,  0.87512891,  0.4288157 ])
Run Code Online (Sandbox Code Playgroud)

所以现在我想我可以做到以下几点:

>>> x[y] = z
Run Code Online (Sandbox Code Playgroud)

但是它比这更充满了整个阵列

>>> x
array([[ 0.04988558,  0.87512891,  0.4288157 ],
       [ 0.04988558,  0.87512891,  0.4288157 ],
       [ 0.04988558,  0.87512891,  0.4288157 ]])
Run Code Online (Sandbox Code Playgroud)

但我希望得到

>>> x
array([[ 0.04988558,           0,          0 ],
       [          0,  0.87512891,          0 ],
       [          0,           0,  0.4288157 ]])
Run Code Online (Sandbox Code Playgroud)

编辑

现在我使用了对角线索引,但在这种情况下我的索引不仅仅是对角线.我希望以下作品:

>>> y = np.array([[0,1],[1,2],[2,0]])
>>> x[y] = z
>>> x
>>> x
array([[          0,  0.04988558,          0 ],
       [          0,           0, 0.87512891 ],
          0.4288157,           0,          0 ]])
Run Code Online (Sandbox Code Playgroud)

但它正如上面那样填充整个阵列

Nil*_*ner 5

数组索引在多维数组上的工作方式略有不同

如果有矢量,则可以使用前导三个元素

x[np.array([0,1,2])]
Run Code Online (Sandbox Code Playgroud)

但是当你在矩阵上使用它时,它将返回前几行.第一眼看到,使用

x[np.array([0,0],[1,1],[2,2]])]
Run Code Online (Sandbox Code Playgroud)

听起来合理.但是,NumPy数组索引的工作方式不同:它仍然以1D方式处理所有这些索引,但返回的矢量值与索引向量的形状相同.

要正确访问2D矩阵,您必须将两个组件拆分为两个单独的阵列:

x[np.array([0,1,2]), np.array([0,1,2])]
Run Code Online (Sandbox Code Playgroud)

这将获取矩阵主对角线上的所有元素.也可以使用此方法进行分配:

x[np.array([0,1,2]), np.array([0,1,2])] = 1
Run Code Online (Sandbox Code Playgroud)

因此,要访问编辑中提到的元素,您必须执行以下操作:

x[np.array([0,1,2]), np.array([1,2,0])]
Run Code Online (Sandbox Code Playgroud)