Sunny
#1
I have an array of array

```
y = [ones(Float32, 3) for i=1:3]
sum(abs2, y)
```

which I can’t apply `abs2`

to.

I need it to compute my loss function

Now I use custom function

```
function flat_this(x)
arr = ones(0)
for i=1:length(x)
arr = vcat(arr, x[i])
end
return arr
end
```

But I doubt it’s optimal and fast enough

`reduce(vcat, y)`

or in this case, to avoid an intermediary Array

`sum(i -> sum(abs2,i), y)`

3 Likes

oheil
#3
Or another alternative:

`sum(abs2,Iterators.flatten(y))`

3 Likes

`Iterators.flatten`

doesn’t allocate because it’s lazy but it’s slower (I have no idea why)

```
julia> y = [rand(100) for i in 1:100];
julia> @btime sum(abs2, reduce(vcat, $y))
7.200 μs (2 allocations: 78.20 KiB)
3333.509067117525
julia> @btime sum(i -> sum(abs2,i), $y)
1.400 μs (0 allocations: 0 bytes)
3333.5090671175253
julia> @btime sum(abs2,Iterators.flatten($y))
9.600 μs (0 allocations: 0 bytes)
3333.5090671175276
```

3 Likes

Another way to flatten `y`

, quite inefficient compared to `reduce(vcat,y)`

above, though:

```
[yi for yr in y for yi in yr]
```

1 Like