@@ -361,18 +361,15 @@ Base.setindex!(mdata::MuData, ad::AnnData, key::AbstractString) = setindex!(mdat
361361Base. setindex! (mdata:: MuData , ad:: AnnData , key:: Symbol ) = setindex! (mdata. mod, ad, string (key))
362362
363363function Base. getindex (
364- mdata:: MuData ,
364+ mdata:: AbstractMuData ,
365365 I:: Union{OrdinalRange, Colon, AbstractVector{<:Integer}, AbstractVector{<:AbstractString}, Number, AbstractString} ,
366366 J:: Union{OrdinalRange, Colon, AbstractVector{<:Integer}, AbstractVector{<:AbstractString}, Number, AbstractString} ,
367367)
368368 @boundscheck checkbounds (mdata, I, J)
369369 i, j = convertidx (I, mdata. obs_names), convertidx (J, mdata. var_names)
370- newmu = MuData (
370+ @inbounds newmu = MuData (
371371 mod= OrderedDict {String, AnnData} (
372- k => ad[
373- getadidx (i, vec (mdata. obsmap[k]), mdata. obs_names),
374- getadidx (j, vec (mdata. varmap[k]), mdata. var_names),
375- ] for (k, ad) ∈ mdata. mod
372+ k => ad[getadidx (i, vec (mdata. obsmap[k])), getadidx (j, vec (mdata. varmap[k]))] for (k, ad) ∈ mdata. mod
376373 ),
377374 obs= isempty (mdata. obs) ? nothing : mdata. obs[i, :],
378375 obs_names= mdata. obs_names[i],
@@ -394,13 +391,9 @@ function Base.getindex(
394391 return newmu
395392end
396393
397- getadidx (I:: Colon , ref:: AbstractVector{<:Unsigned} , idx:: AbstractIndex{<:AbstractString} , reduce_memory= false ) = I
398- function getadidx (
399- I:: Union{AbstractVector{<:Integer}, OrdinalRange} ,
400- ref:: AbstractVector{<:Unsigned} ,
401- idx:: AbstractIndex{<:AbstractString} ,
402- reduce_memory= false ,
403- )
394+ getadidx (I:: Colon , ref:: AbstractVector{<:Unsigned} , reduce_memory= false ) = I
395+ getadidx (I:: OrdinalRange , ref:: AbstractVector{<:Unsigned} , reduce_memory= false ) = filter (> (0x0 ), ref[I])
396+ function getadidx (I:: AbstractVector{<:Integer} , ref:: AbstractVector{<:Unsigned} , reduce_memory= false )
404397 J = filter (> (0x0 ), ref[I])
405398 if reduce_memory && length (J) > 0
406399 diff = J[end ] - J[1 ]
@@ -414,8 +407,7 @@ function getadidx(
414407 end
415408 return J
416409end
417- getadidx (I:: Number , ref:: AbstractVector{<:Unsigned} , idx:: Index{<:AbstractString} , reduce_memory= false ) =
418- getadidx ([I], ref, idx, reduce_memory)
410+ getadidx (I:: Number , ref:: AbstractVector{<:Unsigned} , reduce_memory= false ) = getadidx ([I], ref, reduce_memory)
419411
420412adjustmap! (map:: AbstractVector{<:Unsigned} , I:: Colon ) = map
421413function adjustmap! (map:: AbstractVector{<:Unsigned} , I:: Union{Integer, AbstractVector{<:Integer}, OrdinalRange} )
@@ -999,77 +991,78 @@ push_var!(
999991) where {N, M} =
1000992 _push_attr! (mdata, :var , 0x2 , columns, mods, common= common, prefixed= prefixed, drop= drop, only_drop= only_drop)
1001993
1002- struct MuDataView{Ti, Tj} <: AbstractMuData
994+ mutable struct MuDataView{Ti, Tj} <: AbstractMuData
1003995 parent:: MuData
1004996 I:: Ti
1005997 J:: Tj
1006998
1007- mod:: FrozenDict {String, <:AnnDataView}
999+ mod:: LittleDict {String, <:AnnDataView}
10081000 obs:: SubDataFrame
10091001 obs_names:: SubIndex{<:AbstractString}
10101002 obsm:: StrAlignedMappingView{Tuple{1 => 1}}
10111003 obsp:: StrAlignedMappingView{Tuple{1 => 1, 2 => 1}}
1012- obsmap:: StrAlignedMappingView {Tuple{1 => 1}}
1004+ obsmap:: StrAlignedMapping {Tuple{1 => 1}, MuDataView{Ti, Tj}, false }
10131005
10141006 var:: SubDataFrame
10151007 var_names:: SubIndex{<:AbstractString}
10161008 varm:: StrAlignedMappingView{Tuple{1 => 2}}
10171009 varp:: StrAlignedMappingView{Tuple{1 => 2, 2 => 2}}
1018- varmap:: StrAlignedMappingView {Tuple{1 => 2}}
1010+ varmap:: StrAlignedMapping {Tuple{1 => 2}, MuDataView{Ti, Tj}, false }
10191011
10201012 uns:: Dict{<:AbstractString, <:Any}
1013+
1014+ function MuDataView {Ti, Tj} (parent:: MuData , I:: Ti , J:: Tj ) where {Ti, Tj}
1015+ mv = new (
1016+ parent,
1017+ I,
1018+ J,
1019+ freeze (
1020+ OrderedDict (
1021+ m => view (ad, getadidx (I, vec (parent. obsmap[m]), true ), getadidx (J, vec (parent. varmap[m]), true )) for (m, ad) ∈ parent. mod
1022+ ),
1023+ ),
1024+ )
1025+
1026+ mv. obs = view (parent. obs, nrow (parent. obs) > 0 ? I : (:), :)
1027+ mv. obs_names = view (parent. obs_names, I)
1028+ mv. obsm = view (parent. obsm, I)
1029+ mv. obsp = view (parent. obsp, I, I)
1030+
1031+ mv. var = view (parent. var, nrow (parent. var) > 0 ? J : (:), :)
1032+ mv. var_names = view (parent. var_names, J)
1033+ mv. varm = view (parent. varm, J)
1034+ mv. varp = view (parent. varp, J, J)
1035+
1036+ mv. obsmap = StrAlignedMapping {Tuple{1 => 1}, false} (mv)
1037+ mv. varmap = StrAlignedMapping {Tuple{1 => 2}, false} (mv)
1038+ copy_subset (parent. obsmap, mv. obsmap, I, J),
1039+ copy_subset (parent. varmap, mv. varmap, I, J),
1040+ for mod ∈ keys (mv. mod)
1041+ adjustmap! (vec (mv. obsmap[mod]), I)
1042+ adjustmap! (vec (mv. varmap[mod]), J)
1043+ end
1044+ return mv
1045+ end
10211046end
1047+ MuDataView (parent:: MuData , I:: Ti , J:: Tj ) where {Ti, Tj} = MuDataView {Ti, Tj} (parent, I, J)
10221048
1023- function Base. view (
1049+ @inline function Base. view (
10241050 mu:: MuData ,
1025- I:: Union{OrdinalRange, Colon, AbstractVector{<:Integer}, AbstractVector{<:AbstractString}, Number , AbstractString} ,
1026- J:: Union{OrdinalRange, Colon, AbstractVector{<:Integer}, AbstractVector{<:AbstractString}, Number , AbstractString} ,
1051+ I:: Union{OrdinalRange, Colon, AbstractVector{<:Integer}, AbstractVector{<:AbstractString}, Integer , AbstractString} ,
1052+ J:: Union{OrdinalRange, Colon, AbstractVector{<:Integer}, AbstractVector{<:AbstractString}, Integer , AbstractString} ,
10271053)
10281054 @boundscheck checkbounds (mu, I, J)
10291055 i, j = convertidx (I, mu. obs_names), convertidx (J, mu. var_names)
1030- mod = Dict (
1031- m => view (
1032- ad,
1033- getadidx (i, vec (mu. obsmap[m]), mu. obs_names, true ),
1034- getadidx (j, vec (mu. varmap[m]), mu. var_names, true ),
1035- ) for (m, ad) ∈ mu. mod
1036- )
1037- return MuDataView (
1038- mu,
1039- i,
1040- j,
1041- FrozenDict (mod),
1042- view (mu. obs, nrow (mu. obs) > 0 ? i : (:), :),
1043- view (mu. obs_names, i),
1044- view (mu. obsm, i),
1045- view (mu. obsp, i, i),
1046- view (mu. obsmap, i),
1047- view (mu. var, nrow (mu. var) > 0 ? j : (:), :),
1048- view (mu. var_names, j),
1049- view (mu. varm, j),
1050- view (mu. varp, j, j),
1051- view (mu. varmap, j),
1052- mu. uns,
1053- )
1056+ return MuDataView (mu, i, j)
10541057end
10551058function Base. view (
10561059 mu:: MuDataView ,
1057- I:: Union{OrdinalRange, Colon, AbstractVector{<:Integer}, AbstractVector{<:AbstractString}, Number, AbstractString} ,
1058- J:: Union{OrdinalRange, Colon, AbstractVector{<:Integer}, AbstractVector{<:AbstractString}, Number, AbstractString} ,
1059- )
1060- @boundscheck checkbounds (mu, I, J)
1061- i, j = Base. reindex (parentindices (mu), (convertidx (I, mu. obs_names), convertidx (J, mu. var_names)))
1062- return view (parent (mu), i, j)
1063- end
1064-
1065- function Base. getindex (
1066- mu:: MuDataView ,
1067- I:: Union{OrdinalRange, Colon, AbstractVector{<:Integer}, AbstractVector{<:AbstractString}, Number, AbstractString} ,
1068- J:: Union{OrdinalRange, Colon, AbstractVector{<:Integer}, AbstractVector{<:AbstractString}, Number, AbstractString} ,
1060+ I:: Union{OrdinalRange, Colon, AbstractVector{<:Integer}, AbstractVector{<:AbstractString}, Integer, AbstractString} ,
1061+ J:: Union{OrdinalRange, Colon, AbstractVector{<:Integer}, AbstractVector{<:AbstractString}, Integer, AbstractString} ,
10691062)
10701063 @boundscheck checkbounds (mu, I, J)
10711064 i, j = Base. reindex (parentindices (mu), (convertidx (I, mu. obs_names), convertidx (J, mu. var_names)))
1072- return getindex (parent (mu), i, j)
1065+ return @inbounds view (parent (mu), i, j)
10731066end
10741067
10751068Base. parent (mu:: MuData ) = mu
0 commit comments