Python numpy 2D数组索引

haq*_*haq 29 python numpy

我对python和numpy很新.有人可以帮我理解如何对一些用作索引的数组进行索引.我有以下六个这样的2D阵列 -

array([[2, 0],
   [3, 0],
   [3, 1],
   [5, 0],
   [5, 1],
   [5, 2]])
Run Code Online (Sandbox Code Playgroud)

我想使用这些数组作为索引,并将值10放在新空矩阵的相应索引中.输出应如下所示 -

array([[ 0,  0,  0],
   [ 0,  0,  0],
   [10,  0,  0],
   [10, 10,  0],
   [ 0,  0,  0],
   [10, 10, 10]])
Run Code Online (Sandbox Code Playgroud)

到目前为止,我试过这个 -

    from numpy import*
    a = array([[2,0],[3,0],[3,1],[5,0],[5,1],[5,2]])
    b = zeros((6,3),dtype ='int32')
    b[a] = 10
Run Code Online (Sandbox Code Playgroud)

但这给了我错误的输出.任何帮助请.

unu*_*tbu 49

In [1]: import numpy as np
In [2]: a = np.array([[2,0],[3,0],[3,1],[5,0],[5,1],[5,2]])
In [3]: b = np.zeros((6,3), dtype='int32')

In [4]: b[a[:,0], a[:,1]] = 10

In [5]: b
Out[5]: 
array([[ 0,  0,  0],
       [ 0,  0,  0],
       [10,  0,  0],
       [10, 10,  0],
       [ 0,  0,  0],
       [10, 10, 10]])
Run Code Online (Sandbox Code Playgroud)

为什么会这样:

如果在赋值中b使用两个 numpy数组进行索引,

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

然后把NumPy想象成同时移动每个元素x和每个元素的y每一个元素z(让我们调用它们xval,yvalzval),然后将值赋给b [xval,yval] zval.当z为常数时," z每次移动仅返回相同的值.

这就是我们想要的,x作为第一列ay第二列a.因此,选择x = a[:, 0],和y = a[:, 1].

b[a[:,0], a[:,1]] = 10
Run Code Online (Sandbox Code Playgroud)

为什么b[a] = 10不起作用

当你写b[a],认为NumPy的,如创建由每个元素在移动一个新的数组a,(我们称之为每一个idx)和新的阵列中放置的价值b[idx]在的位置idxa.

idx是一个价值a.所以这是一个int32. b具有形状(6,3),b[idx]也是一排b形状(3,).例如,当idx

In [37]: a[1,1]
Out[37]: 0
Run Code Online (Sandbox Code Playgroud)

b[a[1,1]]

In [38]: b[a[1,1]]
Out[38]: array([0, 0, 0])
Run Code Online (Sandbox Code Playgroud)

所以

In [33]: b[a].shape
Out[33]: (6, 2, 3)
Run Code Online (Sandbox Code Playgroud)

因此,让我们再说一遍:NumPy的是通过移动过的每个要素创建一个新的数组a和新数组中放置的价值b[idx]在的位置idxa.作为idx移动越过a,形状(6,2)的阵列将被创建.但由于b[idx]它本身是形状(3,),在(6,2)形阵列中的每个位置,都放置了一个(3,)形状的值.结果是一个形状数组(6,2,3).

现在,当你做一个像

b[a] = 10
Run Code Online (Sandbox Code Playgroud)

b[a]创建具有值的临时形状数组(6,2,3),然后执行赋值.由于10是常量,因此该赋值将值10放在(6,2,3)形数组中的每个位置.然后将临时数组中的值重新分配回b.请参阅文档参考.因此,(6,2,3)形数组中的值被复制回(6,3)形b数组.值互相覆盖.但重点是你没有获得你想要的任务.

  • 感谢您解释这一点和见解。但说实话 b[a] 是很自然的,很遗憾 numpy 的设计者没有远见来实现它。 (3认同)