我有一段numpy代码,它是(我知道的) works。我之所以知道这一点,是因为我已经在我的通用案例中成功地测试了它。然而,在反复引用文档和尝试和错误两个小时之后,我找到了解决方案。我无法理解我怎么会知道凭直觉去做这件事。
设置:
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。
结果:
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输出:
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.]]])我倾向于相信,我应该能够查看矩阵的形状,指数的形状,以及指数运算,以直观地知道输出。然而,我不能把这个故事放在我的脑海里。比如,它正在改变的子空间的最终形状是什么?,你将如何解释它是如何工作的?
形状:
input: (5, 5, 3)
ind1: (2, 2, 1)
ind2: (2, 1, 2)
final_op: input[ind1, ind2, :]发布于 2021-03-04 16:40:28
有形状
ind1: (2, 2, 1)
ind2: (2, 1, 2)它们一起broadcast来选择一个(2,2,2)空间
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出现在你的结果中的地方。
创建索引数组的一种简单方法:
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)广播就是这样扩大它们的范围:
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]]])]这可能会使模式更加明确:
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.]])https://stackoverflow.com/questions/66470929
复制相似问题