我正在尝试找到一种无需 for 循环即可完成此操作的方法。
假设我有一个多维张量t0
:
bs = 4
seq = 10
v = 16
t0 = torch.rand((bs, seq, v))
Run Code Online (Sandbox Code Playgroud)
这有形状:torch.Size([4, 10, 16])
我有另一个张量labels
,它是维度中一批 5 个随机索引seq
:
labels = torch.randint(0, seq, size=[bs, sample])
Run Code Online (Sandbox Code Playgroud)
所以这个有形状了torch.Size([4, 5])
。这用于索引seq
的维度t0
。
我想要做的是使用labels
张量循环批量维度进行收集。我的暴力解决方案是这样的:
t1 = torch.empty((bs, sample, v))
for b in range(bs):
for idx0, idx1 in enumerate(labels[b]):
t1[b, idx0, :] = t0[b, idx1, :]
Run Code Online (Sandbox Code Playgroud)
得到t1
形状为的张量:torch.Size([4, 5, 16])
在 pytorch 中是否有更惯用的方法?
我正在使用现代fortran进行并行编程.我正在使用vim,我真的很讨厌fortran.vim语法文件似乎不处理像!$ omp或!dir $这样的编译器指令.这些只是在vim中呈现为注释,因此它们不会脱颖而出.在c/c ++中,这些编译器指令是使用#pragma完成的,所以一切都像预处理器代码而不是注释代码一样突出.所以我想用我的fortran语法进行类似的处理.这是我想要着色的多行指令的示例:
!$omp parallel do reduction(+: sum0) reduction(+: sum1) &
private( nn, S1, S2, Y1, Y2, rvec0, rvec1, iThreadNum)
Run Code Online (Sandbox Code Playgroud)
到目前为止我所拥有的是一个位于$ HOME/.vim/after/syntax中的新fortran.vim文件.我已经让它在一行的开头识别出'!$ omp',并为该行着色并正确地为多线条着色.我的语法文件包含:
syn region fortranDirective start=/!$omp.*/ end=/[^\&]$/
hi def link fortranDirective PreProc
Run Code Online (Sandbox Code Playgroud)
我的问题是它现在无法处理只有一行的简单情况.即:
!$omp parallel do blah blah
call foobar <-- this is coloured the same as the line above
Run Code Online (Sandbox Code Playgroud)
我需要在语法文件中使用某种正则表达式规则才能正确匹配单行和续行.有人可以帮忙吗?