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