I am having trouble understanding this:
**Warning:**
findnz(A::AbstractMatrix)is deprecated, use
begin
│ I = findall(!iszero, A)
│ (getindex.(I, 1), getindex.(I, 2), A[I])
│ end instead. **│**
What does it mean?
Thanks
I am having trouble understanding this:
**Warning:**
findnz(A::AbstractMatrix)is deprecated, use
begin
│ I = findall(!iszero, A)
│ (getindex.(I, 1), getindex.(I, 2), A[I])
│ end instead. **│**
What does it mean?
Thanks
It is telling you to write
I = findall(!iszero, A)
getindex.(I, 1), getindex.(I, 2), A[I]
instead of findnz
because this will give you the exact output that findnz
used to do.
julia> A = rand(0:1, 2, 2)
2×2 Array{Int64,2}:
0 0
1 1
julia> I = findall(!iszero, A)
2-element Array{CartesianIndex{2},1}:
CartesianIndex(2, 1)
CartesianIndex(2, 2)
julia> getindex.(I, 1), getindex.(I, 2), A[I]
([2, 2], [1, 2], [1, 1])
However, it is rarely needed to do this destructuring of I
.
Got it! It was the begin and end bits that threw me. I have findnz sprayed through out my code base. I am tempted to simply implement my own findnz using the new replacement code from above. Nevertheless, findnz must have been deprecated for a reason. Would rolling my own be ill advised.
You can read a little bit of background at https://github.com/JuliaLang/julia/pull/27869.
You can always pack up the code above in your own findnz
function and at some later point think about if you want to refactor your code to not need it.
I think it would be nice to have a Base.@deprecate
version that allows you to provide a bit more information. Right now, either you use Base.@deprecate
, which is convenient but can result in somewhat convoluted replacement suggestions like this, or you manually use Base.depwarn
, which has the opposite problem.