src_indices 最佳实践
src_indices best practices
版本之后3.13 src_indices 已更改,我在文档中找不到它。您能否分享连接大型矩阵的较小部分的示例代码?
即源是 5x5 矩阵,目标是从 [2,3]
开始的 2x2
我发现将连接视为切片是最简单的。我们添加了 om.slicer
来通过切片符号处理索引。以下示例连接 5x5 矩阵的 2x2 部分,从索引 [2, 3] 开始:
import openmdao.api as om
import numpy as np
print('Connecting a 2x2 submatrix of M to B')
p = om.Problem()
ivc = p.model.add_subsystem('ivc', om.IndepVarComp())
ivc.add_output('M', val=np.arange(25).reshape((5, 5)))
exec = p.model.add_subsystem('exec', om.ExecComp())
exec.add_expr('A = B', A={'shape': (2, 2)}, B={'shape': (2, 2)})
p.model.connect('ivc.M', 'exec.B', src_indices=om.slicer[2:4, 3:5])
p.setup()
p.run_model()
print('M')
print(p.get_val('ivc.M'))
print('A')
print(p.get_val('exec.A'))
Connecting a 2x2 submatrix of M to B
M
[[ 0. 1. 2. 3. 4.]
[ 5. 6. 7. 8. 9.]
[10. 11. 12. 13. 14.]
[15. 16. 17. 18. 19.]
[20. 21. 22. 23. 24.]]
A
[[13. 14.]
[18. 19.]]
或者,例如,仅将 5x5 矩阵的第 [0, 2, 3] 行连接到目标:
rint('Connecting rows 0, 2, and 3 of M to B')
p = om.Problem()
ivc = p.model.add_subsystem('ivc', om.IndepVarComp())
ivc.add_output('M', val=np.arange(25).reshape((5, 5)))
exec = p.model.add_subsystem('exec', om.ExecComp())
exec.add_expr('A = B', A={'shape': (3, 5)}, B={'shape': (3, 5)})
p.model.connect('ivc.M', 'exec.B', src_indices=om.slicer[[0, 2 ,3], :])
p.setup()
p.run_model()
print('M')
print(p.get_val('ivc.M'))
print('A')
print(p.get_val('exec.A'))
Connecting rows 0, 2, and 3 of M to B
M
[[ 0. 1. 2. 3. 4.]
[ 5. 6. 7. 8. 9.]
[10. 11. 12. 13. 14.]
[15. 16. 17. 18. 19.]
[20. 21. 22. 23. 24.]]
A
[[ 0. 1. 2. 3. 4.]
[10. 11. 12. 13. 14.]
[15. 16. 17. 18. 19.]]
虽然我们在一些并行化文档中讨论了此功能,但您说得对,我们需要在连接文档中讨论它。
版本之后3.13 src_indices 已更改,我在文档中找不到它。您能否分享连接大型矩阵的较小部分的示例代码?
即源是 5x5 矩阵,目标是从 [2,3]
开始的 2x2我发现将连接视为切片是最简单的。我们添加了 om.slicer
来通过切片符号处理索引。以下示例连接 5x5 矩阵的 2x2 部分,从索引 [2, 3] 开始:
import openmdao.api as om
import numpy as np
print('Connecting a 2x2 submatrix of M to B')
p = om.Problem()
ivc = p.model.add_subsystem('ivc', om.IndepVarComp())
ivc.add_output('M', val=np.arange(25).reshape((5, 5)))
exec = p.model.add_subsystem('exec', om.ExecComp())
exec.add_expr('A = B', A={'shape': (2, 2)}, B={'shape': (2, 2)})
p.model.connect('ivc.M', 'exec.B', src_indices=om.slicer[2:4, 3:5])
p.setup()
p.run_model()
print('M')
print(p.get_val('ivc.M'))
print('A')
print(p.get_val('exec.A'))
Connecting a 2x2 submatrix of M to B
M
[[ 0. 1. 2. 3. 4.]
[ 5. 6. 7. 8. 9.]
[10. 11. 12. 13. 14.]
[15. 16. 17. 18. 19.]
[20. 21. 22. 23. 24.]]
A
[[13. 14.]
[18. 19.]]
或者,例如,仅将 5x5 矩阵的第 [0, 2, 3] 行连接到目标:
rint('Connecting rows 0, 2, and 3 of M to B')
p = om.Problem()
ivc = p.model.add_subsystem('ivc', om.IndepVarComp())
ivc.add_output('M', val=np.arange(25).reshape((5, 5)))
exec = p.model.add_subsystem('exec', om.ExecComp())
exec.add_expr('A = B', A={'shape': (3, 5)}, B={'shape': (3, 5)})
p.model.connect('ivc.M', 'exec.B', src_indices=om.slicer[[0, 2 ,3], :])
p.setup()
p.run_model()
print('M')
print(p.get_val('ivc.M'))
print('A')
print(p.get_val('exec.A'))
Connecting rows 0, 2, and 3 of M to B
M
[[ 0. 1. 2. 3. 4.]
[ 5. 6. 7. 8. 9.]
[10. 11. 12. 13. 14.]
[15. 16. 17. 18. 19.]
[20. 21. 22. 23. 24.]]
A
[[ 0. 1. 2. 3. 4.]
[10. 11. 12. 13. 14.]
[15. 16. 17. 18. 19.]]
虽然我们在一些并行化文档中讨论了此功能,但您说得对,我们需要在连接文档中讨论它。