Counting certain elements in lists
For your result1
:
Count[1] /@ data1[[All, 2, 1]]
For your result2
:
Map[Count[1], data2[[All, All, 2, 1]], {2}];
r1 = Total[1 - Unitize[data1[[All, 2, 1]] - 1], {2}]
Short @ %
{5,5,4,6,5,8,5,6,5,4,8,6,3,3,2,7,2,9,5,6,4,5,3,8,7,6,8,3,7,5,9,4,7,6,5,4,5,5,<<925>>,7,5,6,6,3,5,4,6,6,9,7,9,5,6,4,3,8,4,4,6,6,9,6,6,3,8,3,4,1,8,4,4,4,5,7,8,5}
r2 = Join @@@ Total[1 - Unitize[data2[[All, All, 2]] - 1], {4}];
r2 // Dimensions
{50, 1000}
Timings: Timing comparison with OP's Do
loop and MarcoB's Map[Count,...]
for data2
:
n1 = 1000;
n3 = 50;
data2 = Array[0 &, n3];
SeedRandom[1]
Do[data2[[i]] = {#, {RandomInteger[3, 20]}} & /@ Range[n1];, {i, 1, n3}];
result2a = Join @@@ Total[1 - Unitize[data2[[All, All, 2]] - 1], {4}]; //
RepeatedTiming // First
0.037
result2b = Map[Count[1], data2[[All, All, 2, 1]], {2}]; // RepeatedTiming // First
0.12
(result2 = Array[0 &, n3];
Do[result2[[j]] = Table[Count[Flatten@(data2[[j, i, 2]]), u_ /; u == 1],
{i, 1, n1}];, {j, 1, n3}];) // RepeatedTiming // First
7.8
result2 == result2a == result2b
True