【发布时间】:2021-12-03 12:55:06
【问题描述】:
我有一个 3D 数组,我想从轴 1 获取随机“集合”(注意:不是 pythonic 集合),N 次。我可以通过嵌套的 For 循环来实现这一点,但我至少需要这样做 10000 次,所以如果可能的话,我需要找到一个矢量化的解决方案。
我将尝试用一个例子来解释这一点。如果我想检索 N 组数据,我想从我的 3D 数组中的轴 1 中为轴 0 中的每个元素选择一个随机索引。例如在我的 N 个集合中的第一个中,我随机选择索引 [0, 2, 1],这与三个不同的数组位置相关:分别为 [0, 0, :]、[1, 2, :] 和 [2, 1, :](即轴 0 每次递增一个,轴1 基于随机选择的索引)。
以下是伪代码中的数值示例:
# Create some arbitrary data (EDIT: based on mozway's answer)
a = array([[[ 0. , 4. , 8. , 12. , 16. , 20. , 24. ],
[ 1. , 5. , 9. , 13. , 17. , 21. , 25. ],
[ 2. , 6. , 10. , 14. , 18. , 22. , 26. ],
[ 3. , 7. , 11. , 15. , 19. , 23. , 27. ]],
[[ 0.1, 4.1, 8.1, 12.1, 16.1, 20.1, 24.1],
[ 1.1, 5.1, 9.1, 13.1, 17.1, 21.1, 25.1],
[ 2.1, 6.1, 10.1, 14.1, 18.1, 22.1, 26.1],
[ 3.1, 7.1, 11.1, 15.1, 19.1, 23.1, 27.1]],
[[ 0.2, 4.2, 8.2, 12.2, 16.2, 20.2, 24.2],
[ 1.2, 5.2, 9.2, 13.2, 17.2, 21.2, 25.2],
[ 2.2, 6.2, 10.2, 14.2, 18.2, 22.2, 26.2],
[ 3.2, 7.2, 11.2, 15.2, 19.2, 23.2, 27.2]]])
# Define the number of requested sets
N = 2
# Define the chosen data per 'set' (normally would be random)
idx = [[0, 2, 1], [1, 3, 3]]
# First set would give (with choices [0, 2, 1]):
arr = [[ 0. , 4. , 8. , 12. , 16. , 20. , 24. ],
[ 2.1, 6.1, 10.1, 14.1, 18.1, 22.1, 26.1],
[ 1.2, 5.2, 9.2 , 13.2, 17.2, 21.2, 25.2]]
# Second set would give (with choices [1, 3, 3]):
arr = [[ 1. , 5. , 9. , 13. , 17. , 21. , 25. ],
[ 3.1, 7.1, 11.1, 15.1, 19.1, 23.1, 27.1],
[ 3.2, 7.2, 11.2, 15.2, 19.2, 23.2, 27.2]]
# So, the final output would combine all sets:
arr = [[[ 0. , 4. , 8. , 12. , 16. , 20. , 24. ],
[ 2.1, 6.1, 10.1, 14.1, 18.1, 22.1, 26.1],
[ 1.2, 5.2, 9.2 , 13.2, 17.2, 21.2, 25.2]],
[ 1. , 5. , 9. , 13. , 17. , 21. , 25. ],
[ 3.1, 7.1, 11.1, 15.1, 19.1, 23.1, 27.1],
[ 3.2, 7.2, 11.2, 15.2, 19.2, 23.2, 27.2]]]
【问题讨论】:
-
你能在没有循环概念的情况下解释你的目标吗?比如从
x开始,你如何选择元素来产生最终的输出? -
@mozway 以我的例子为例,当第一次通过循环时,目标是收集 3 条数据,其中每条数据来自一组单独的 4 个“光谱”,即一个是从第一行随机选择:[1, 2, ..., 7], [2, 3, ..., 8], [3, 4, ..., 9], [4, 5, ..., 10],第二行的下一块:[1, 2, ..., 33], [2, 3, ..., 34], [3, 4, ..., 35] , [4, 5, ..., 36],第三行的最后一段:[1, 2, ..., 37], [2, 3, ..., 38], [3, 4 , ..., 39], [4, 5, ..., 40]。这三个随机选择的“光谱”构成了“临时”的第一个条目。这会重复 N 次。
-
我建议您编辑您的问题以将其清理到最低限度(即,说明您要在axis1中选择随机行但相对于axis0独立),您可以删除所有代码以保留描述和输入/输出示例
-
感谢大家的帮助,我马上修改。
标签: python arrays numpy vectorization