首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解释numpy高级索引解决方案

如何解释numpy高级索引解决方案
EN

Stack Overflow用户
提问于 2021-03-04 08:09:20
回答 1查看 36关注 0票数 1

我有一段numpy代码,它是(我知道的) works。我之所以知道这一点,是因为我已经在我的通用案例中成功地测试了它。然而,在反复引用文档和尝试和错误两个小时之后,我找到了解决方案。我无法理解我怎么会知道凭直觉去做这件事。

设置:

代码语言:javascript
复制
a = np.zeros((5,5,3))

目标:设定为1指数0,1轴1,2轴0,1轴3,3,4轴3,2轴3,3 4,轴3全部。

更明确的目标:将块1和2的前两行设置为1,块3和4的最后两行设置为1

结果:

代码语言:javascript
复制
ax1 =np.array([np.array([0,1]),np.array([3,4])])
ax1 =np.array([x[:,np.newaxis] for x in ax1])
ax2 = np.array([[[0,1]],[[3,4]]])
a[ax1,ax2,:] = 1
a

输出:

代码语言:javascript
复制
array([[[1., 1., 1.],
    [1., 1., 1.],
    [0., 0., 0.],
    [0., 0., 0.],
    [0., 0., 0.]],

   [[1., 1., 1.],
    [1., 1., 1.],
    [0., 0., 0.],
    [0., 0., 0.],
    [0., 0., 0.]],

   [[0., 0., 0.],
    [0., 0., 0.],
    [0., 0., 0.],
    [0., 0., 0.],
    [0., 0., 0.]],

   [[0., 0., 0.],
    [0., 0., 0.],
    [0., 0., 0.],
    [1., 1., 1.],
    [1., 1., 1.]],

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

我倾向于相信,我应该能够查看矩阵的形状,指数的形状,以及指数运算,以直观地知道输出。然而,我不能把这个故事放在我的脑海里。比如,它正在改变的子空间的最终形状是什么?,你将如何解释它是如何工作的?

形状:

代码语言:javascript
复制
input: (5, 5, 3)
ind1: (2, 2, 1)
ind2: (2, 1, 2)
final_op: input[ind1, ind2, :]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-04 16:40:28

有形状

代码语言:javascript
复制
ind1: (2, 2, 1)
ind2: (2, 1, 2)

它们一起broadcast来选择一个(2,2,2)空间

代码语言:javascript
复制
In [4]: ax1
Out[4]: 
array([[[0],
        [1]],

       [[3],
        [4]]])
In [5]: ax2
Out[5]: 
array([[[0, 1]],

       [[3, 4]]])

因此,对于第1维(块),它选择块0、1、3和4。在第二维中,它也选择这些行。

这是前两个块的前两行,最后两个块的最后两行。这就是1出现在你的结果中的地方。

创建索引数组的一种简单方法:

代码语言:javascript
复制
In [7]: np.array([[0,1],[3,4]])[:,:,None]   # (2,2) expanded to (2,2,1)
In [8]: np.array([[0,1],[3,4]])[:,None,:]   # expand to (2,1,2)

广播就是这样扩大它们的范围:

代码语言:javascript
复制
In [10]: np.broadcast_arrays(ax1,ax2)
Out[10]: 
[array([[[0, 0],              # block indices
         [1, 1]],
 
        [[3, 3],
         [4, 4]]]),
 array([[[0, 1],              # row indices
         [0, 1]],
 
        [[3, 4],
         [3, 4]]])]

这可能会使模式更加明确:

代码语言:javascript
复制
In [15]: a[ax1,ax2,:] = np.arange(1,5).reshape(2,2,1)
In [16]: a[:,:,0]
Out[16]: 
array([[1., 2., 0., 0., 0.],
       [3., 4., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 1., 2.],
       [0., 0., 0., 3., 4.]])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66470929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档