pick[expr_, struct_] := pick[expr, struct, True];
pick[expr_, struct_, patt_] /; MatchQ[struct, patt] := expr;
pick[expr_, struct_, patt_] /;
Depth[struct] == 1 || Depth[expr] == 1 := Sequence[];
pick[h_[args___], _[sargs___], patt_] /;
Length@{args} == Length@{sargs} :=
pick[#1, #2, patt] & @@@ h @@ Transpose@{{args}, {sargs}};
_pick := Throw@"Incompatible shapes, blabla"