gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:00:46 25 4
gpt4 key购买 nike

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

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 填充的数组。

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

最佳答案

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 个索引数组的元组。将其应用于二维数组,我们看到它设置了反向对角线。

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

关于python - 为什么 numpy 索引在更高维度上的工作方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33045345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com