我有一个大型数组,需要更改它的一些值,但根据维度的数量得到不一致的结果。最小的例子如下:
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的数组。
问题:为什么这些不一样?当我实际上有一个像第二个例子中那样更高维的数组时,我怎么能模仿第一个例子的行为呢?
答案 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