Efficiently sample vectors from numpy ndarray
我有一个shape的多维numpy数组X:(B, dim, H, W)我想从X中随机抽取kdim维向量。我可以从形状为(B, 1, H, W)的msk中得到样本指数:
1
| sIdx = random.sample((msk.flat>=0).nonzero()[0], k) |
使用numpy的等效采样代码为:
1
| sIdx = np.random.choice((msk.flat>=0).nonzero()[0], replace=False, size=(k,)) |
号
但如何根据"平面"抽样指标sIdx有效地分割X?也就是说,有没有一种有效的方法将随机抽取的msk与切片的X相结合?
- random是否来自模块random?最终输出的形状是什么?
- @Divakar是的,sample来自random模块。取样可以用sIdx = np.random.choice((msk.flat>=0).nonzero()[0], replace=False, size=(k,))代替。
- @除此之外,我希望最终的输出是shapekby-dim。
- @尼尔斯沃纳感谢你的回答。我尽量避免使用reshape和transpose。
从展平的指数中得到这三个轴中其余带有np.unravel_index的各指数,然后沿着这些轴简单地索引到X中,以获得最终输出,就像这样。-
1 2
| I,J,K = np.unravel_index(sIdx, (B, H, W))
out = X[I,:,J,K] |
- 谢谢!有没有一种方法可以"融合"扁平采样和unravel,使这一过程更加有效?也就是说,有没有一种方法可以直接对"未分解"的ED指数进行抽样?
- @谢伊,我看不到其他的方式。我们需要flat生成线性指数,以便进行抽样。现在,flat只是一个视图,因此不需要额外的内存,所以应该是相当有效的。
- 只是试着写一个答案而不让指数变平,是的,我甚至不想提交,因为它太混乱和混乱,根本无法提高性能。
- @好吧,不管怎样,谢谢你的努力!你会考虑将发布作为"负面"结果吗?
- 一开始是和sIdx = random.sample(list(np.transpose((msk >= 0).nonzero())), k) 合作,后来连我都迷路了。问题是你有4个指数进入,只需要3个指数出来,平坦是一个更好的方法。
- @丹尼尔,不管怎样,谢谢你!