为什么numpy索引在更高维度上的工作方式不同?

时间:2015-10-09 18:57:21

标签: python numpy

我有一个大型数组,需要更改它的一些值,但根据维度的数量得到不一致的结果。最小的例子如下:

a=np.zeros((3,3))
indx=np.array([2,4,6])
a[np.unravel_index(indx, (3,3))] = 1

按预期工作。但是,以下内容不会:

b=np.zeros((1,3,3))
indx=np.array([2,4,6])
b[0,np.unravel_index(indx, (3,3))] = 1

并给出一个填充1的数组。

问题:为什么这些不一样?当我实际上有一个像第二个例子中那样更高维的数组时,我怎么能模仿第一个例子的行为呢?

3 个答案:

答案 0 :(得分:1)

以下内容应该有效:

b[np.unravel_index(indx, (1,3,3))] = 1

答案 1 :(得分:1)

unravel_index会产生什么?

In [126]: indx=np.array([2,4,6])    
In [128]: i=np.unravel_index(indx,(3,3))    
In [129]: i
Out[129]: (array([0, 1, 2]), array([2, 1, 0]))

2个索引数组的元组。将其应用于2d数组,我们看到它设置了反向对角线。

In [130]: a=np.zeros((3,3),int)

In [131]: a[i]=1

In [132]: a
Out[132]: 
array([[0, 0, 1],
       [0, 1, 0],
       [1, 0, 0]])

我们如何在3d数组的第二个平面上设置反向对角线?我们需要3个索引,对吧?

In [133]: a=np.zeros((2,3,3),int)

In [134]: a[1,[0,1,2],[2,1,0]]=1
#  a[(1,[0,1,2],[2,1,0])]=1  is the same thing

In [135]: a
Out[135]: 
array([[[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]],

       [[0, 0, 1],
        [0, 1, 0],
        [1, 0, 0]]])

现在问题是 - 如何从(array([0, 1, 2]), array([2, 1, 0]))转到(1,[0,1,2],[2,1,0])

对于第一个平面,(1,3,3)有效,因为它产生一个3元素元组。 (2,3,3)做同样的事情。

In [140]: np.unravel_index(indx,(1,3,3))
Out[140]: (array([0, 0, 0]), array([0, 1, 2]), array([2, 1, 0]))

如何连接2个元组?

In [142]: (1,)+np.unravel_index(indx,(3,3))
Out[142]: (1, array([0, 1, 2]), array([2, 1, 0]))

有许多numpy函数通过混合和匹配元组,列表和数组来构造索引。

您还可以从列表中构建元组:

In [153]: ind=[1,0,0]
In [154]: ind[1:]=np.unravel_index(indx,(3,3))
In [155]: a[tuple(ind)]=2

答案 2 :(得分:1)

unravel_index(indx, (3,3))返回长度为2的元组,因为len((3,3))==2。 如果你想使用那个元组用你自己的第一个昏暗索引索引一个3-dim数组,你需要将你的索引添加到元组,使其成为length==3的元组:

b[ ([0,0,0],) + np.unravel_index(indx, (3,3)) ] = 1
b
=> array([[[ 0.,  0.,  1.],
           [ 0.,  1.,  0.],
           [ 1.,  0.,  0.]]])

现在,如果第一个昏暗时间长于1,您可以将[0,0,0]更改为您想要的任何颜色。

了解问题的另一种方法是:

说:

k = np.unravel_index(indx, (3,3))

然后你想要:

b[0,k[0],k[1]] = 1

这与您尝试的内容不同:

b[0,k] = 1
BTW,简化版也可以。元组的第一个元素不必是数组:

j = (0,) + np.unravel_index(indx, (3,3))
j
=> (0, array([0, 1, 2]), array([2, 1, 0]))
b[j] = 1