Which is the most efficient way to determine if the columns of a matrix are all integers, e.g. a = [1 1.5 2; 10 3.1 3] columns 1 and 3 ?
Note that if I would have defined a = Any[1 1.5 2; 10 3.1 3] I could have used
julia> identity.(a[:,1])
2-element Vector{Int64}:
1
10
and then use eltype, but it doesn’t work if a has been already cast to a matrix of Floats and I don’t know its content a priori.
I can use try/catch with convert, but I feel it would be even more inefficient…
jar1
October 4, 2022, 9:01am
2
julia> isinteger.(Any[1 1.5 2; 10 3.1 3])
2×3 BitMatrix:
1 0 1
1 0 1
2 Likes
Thanks, I wasn’t aware of the specific isinteger function. Contrary to identity it works also for Float converted matrices:
julia> a = [1 1.5 2; 10 3.1 3]
2×3 Matrix{Float64}:
1.0 1.5 2.0
10.0 3.1 3.0
julia> all(isinteger.(a[:,1]))
true
DNF
October 4, 2022, 9:26am
4
Better try to avoid slicing and broadcasting, by using the all(func, arr) version, with a dimension keyword:
julia> a = [1 1.5 2; 10 3.1 3]
2×3 Matrix{Float64}:
1.0 1.5 2.0
10.0 3.1 3.0
julia> all(isinteger, a; dims=1)
1×3 Matrix{Bool}:
1 0 1
4 Likes
Actually, this didn’t directly work for me, as in some cases I have string.
I solved with:
isinteger_bml(_) = false
isinteger_bml(_::Integer) = true
isinteger_bml(x::AbstractFloat) = isinteger(x)
I don’t know why there isn’t an isinteger() defaulting to false for all non integer types (except Nothing and Missing)
Because we have no way of know that’s correct for novel numeric types. It would arguably be fine for non-numeric types, but then again why are you calling isinteger on values that aren’t even numbers?
1 Like
DNF
October 4, 2022, 5:18pm
7
You can skip the variable entirely, like this:
isinteger_bml(::Integer) = true
You mean non-numeric? I think it makes more sense to assume that asking if e.g. a Dict is an integer is a bug, rather than a just returning false.
2 Likes