Class: CAWindowIterator
- Inherits:
-
CAIterator
- Object
- CAIterator
- CAWindowIterator
- Defined in:
- lib/carray/window_iterator.rb
Overview
Rolling (sliding-window) reduction dispatcher — the Window member of the
iterator family (sibling of CASlabIterator / CABlockIterator /
CACategoricalIterator). It folds an overlapping window centred on every
anchor cell, so the result is shaped like the source rather than reduced.
Obtained from CArray#windows, not constructed directly.
Instance Attribute Summary collapse
-
#bounds ⇒ Symbol
readonly
Returns the boundary policy symbol.
-
#source ⇒ CArray
readonly
Returns the array being rolled over.
Attributes inherited from CAIterator
Instance Method Summary collapse
-
#accumulate(min_count: nil, fill_value: nil) ⇒ CArray
Rolling sum kept in the source's own data type, wrapping at its width, as the core
accumulatedoes --sumanswers in the type the core promotes to (float64 for integers). -
#all(min_count: nil, fill_value: nil) ⇒ CArray
Whether every cell of each rolling is true.
-
#any(min_count: nil, fill_value: nil) ⇒ CArray
Whether any cell of each rolling is true.
-
#convolve(kernel, min_count: nil, fill_value: nil) ⇒ CArray
Rolling convolution
out[i] = Σ_j a[i-j]·k[j](true convolution: the kernel is flipped on every window axis). -
#correlate(kernel, min_count: nil, fill_value: nil) ⇒ CArray
Rolling cross-correlation
out[i] = Σ_j a[i+j]·k[j](kernel not flipped). -
#count(v = <none>) ⇒ CArray
Rolling count over the window.
-
#count_masked ⇒ CArray
Rolling count of masked cells.
-
#count_not_masked ⇒ CArray
Rolling count of present (non-masked) cells -- the denominator of a renormalizing convolution.
-
#cumcount ⇒ Object
Not supported for a window iterator.
-
#cummax ⇒ Object
Not supported for a window iterator.
-
#cummin ⇒ Object
Not supported for a window iterator.
-
#cumprod ⇒ Object
Not supported for a window iterator.
-
#cumsum ⇒ Object
Not supported for a window iterator.
-
#each({ |window| ... }) {|window| ... } ⇒ Enumerator, self
Yields each anchor's window as a CArray.
-
#elements ⇒ CArray
Window cell count (structural, mask-independent): the constant window size
Π w_i, shaped like the output. -
#initialize(source, ranges, bounds: :skip, fill_value: nil) ⇒ CAWindowIterator
constructor
Builds a window iterator over
sourcewith a per-axis offset range. -
#map ⇒ Object
Not supported for a window iterator: overlapping windows share cells, so an element-wise transform has no well-defined scatter-back.
-
#max(min_count: nil, fill_value: nil) ⇒ CArray
Rolling maximum.
-
#max_addr ⇒ CArray
Rolling flat source address of the window maximum.
-
#max_index(min_count: nil, fill_value: nil) ⇒ CArray
Rolling position of the maximum, local to the window axes.
-
#mean(min_count: nil, fill_value: nil) ⇒ CArray
Rolling arithmetic mean.
-
#median ⇒ CArray
Rolling median.
-
#min(min_count: nil, fill_value: nil) ⇒ CArray
Rolling minimum.
-
#min_addr ⇒ CArray
Rolling flat SOURCE address of the window minimum — which source cell holds it, so
source.reshape(source.elements)[sw.min_addr]are the window minima. -
#min_index(min_count: nil, fill_value: nil) ⇒ CArray
Rolling position of the minimum, local to the window axes.
-
#minmax(min_count: nil, fill_value: nil) ⇒ Array<CArray>
Rolling minimum and maximum, found in one pass.
-
#percentile(*pers) ⇒ CArray+
Rolling percentile(s).
-
#prod(min_count: nil, fill_value: nil) ⇒ CArray
Rolling product.
-
#quantile ⇒ Array<CArray>
Rolling five-number summary
[min, Q1, median, Q3, max](five CArrays), asCArray#quantile. - #reduce(*args, data_type: nil, &blk) ⇒ Object
-
#sliding_view ⇒ CArray
Returns the sliding_windows view feeding the reductions.
-
#sort_addr ⇒ Object
Not supported for a window iterator: a window's boundary cells are padding with no source address, and overlapping windows share cells, so a per-window sort returning source flat addresses is ill-defined.
-
#stddev(min_count: nil, fill_value: nil) ⇒ CArray
Rolling sample standard deviation (divisor
n - 1). -
#stddevp(min_count: nil, fill_value: nil) ⇒ CArray
Rolling population standard deviation (divisor
n). -
#sum(min_count: nil, fill_value: nil) ⇒ CArray
Rolling sum.
-
#variance(min_count: nil, fill_value: nil) ⇒ CArray
Rolling sample variance (divisor
n - 1). -
#variancep(min_count: nil, fill_value: nil) ⇒ CArray
Rolling population variance (divisor
n). -
#wmean(weights) ⇒ CArray
Rolling weighted mean,
weightsshaped like a single window. -
#wsum(weights) ⇒ CArray
Rolling weighted sum,
weightsshaped like a single window.
Constructor Details
#initialize(source, ranges, bounds: :skip, fill_value: nil) ⇒ CAWindowIterator
Returns a new instance of CAWindowIterator.
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
# File 'lib/carray/window_iterator.rb', line 83 def initialize (source, *ranges, bounds: :skip, fill_value: nil) if source.is_a?(CArray) && source.obj_type == CA_OBJ_WINDOW # Backward-compat: read geometry from a CAWindow view built by #window. # start[i] = lo, shape[i] (window width) = w, so hi = lo + w - 1. win = source @source = win.parent widths = win.shape @ranges = win.start.each_with_index.map { |lo, i| lo..(lo + widths[i] - 1) } # The legacy #window default is FILL (constant), whose value is the # view's fill_value; map that to a :constant margin. @bounds = :constant @fill_value = win.fill_value else @source = source @ranges = ranges.flatten(0) @bounds = bounds @fill_value = fill_value end unless @ranges.size == @source.ndim raise ArgumentError, "windows: expected #{@source.ndim} ranges (one per axis), " \ "got #{@ranges.size}" end @sndim = @source.ndim @widths = @ranges.map { |r| r.end - r.begin + 1 } @lefts = @ranges.map { |r| [0, -r.begin].max } # left margin per axis @rights = @ranges.map { |r| [0, r.end ].max } # right margin per axis # A constant fill_value: overrides :skip (constant margin escape hatch). @bounds = :constant if @fill_value != nil && @bounds == :skip # Trailing window axes of the sliding_windows view: [ndim .. 2*ndim-1]. @window_axes = (@sndim...(2 * @sndim)).to_a # Output iteration space (reference-shaped, except :truncate, which keeps # only the anchors whose window lies wholly inside the source), and where # each axis's first window starts in the buffer the windows are read from. # A window that does not cover its own anchor -- `windows(1..2)`, the two # cells after this one -- starts further along than the margin allows for, # which is what @origins carries. rshape = @source.shape if @bounds == :truncate first = @ranges.map { |r| [0, -r.begin].max } last = @sndim.times.map { |i| [rshape[i] - 1, rshape[i] - 1 - @ranges[i].end].min } @shape = @sndim.times.map { |i| [last[i] - first[i] + 1, 0].max } @origins = @ranges.map { |r| [r.begin, 0].max } else @shape = rshape.dup @origins = @sndim.times.map { |i| @lefts[i] + @ranges[i].begin } end @ndim = @shape.size self end |
Instance Attribute Details
#bounds ⇒ Symbol (readonly)
147 148 149 |
# File 'lib/carray/window_iterator.rb', line 147 def bounds @bounds end |
#source ⇒ CArray (readonly)
142 143 144 |
# File 'lib/carray/window_iterator.rb', line 142 def source @source end |
Instance Method Details
#accumulate(min_count: nil, fill_value: nil) ⇒ CArray
Rolling sum kept in the source's own data type, wrapping at its
width, as the core accumulate does -- sum answers in the type
the core promotes to (float64 for integers).
408 409 410 411 412 413 414 415 416 417 418 419 420 |
# File 'lib/carray/window_iterator.rb', line 408 [:sum, :accumulate, :prod, :mean, :min, :max, :variance, :stddev, :all, :any, :variancep, :stddevp, :minmax, :min_index, :max_index].each do |op| class_eval <<~RUBY, __FILE__, __LINE__ + 1 def #{op} (min_count: nil, fill_value: nil) folded = fold_by_offset(:#{op}, min_count, fill_value) return folded unless folded.nil? kw = {} kw[:min_count] = min_count unless min_count.nil? kw[:fill_value] = fill_value unless fill_value.nil? sliding_view.#{op}(axis: @window_axes, **kw) end RUBY end |
#all(min_count: nil, fill_value: nil) ⇒ CArray
Whether every cell of each rolling is true.
408 409 410 411 412 413 414 415 416 417 418 419 420 |
# File 'lib/carray/window_iterator.rb', line 408 [:sum, :accumulate, :prod, :mean, :min, :max, :variance, :stddev, :all, :any, :variancep, :stddevp, :minmax, :min_index, :max_index].each do |op| class_eval <<~RUBY, __FILE__, __LINE__ + 1 def #{op} (min_count: nil, fill_value: nil) folded = fold_by_offset(:#{op}, min_count, fill_value) return folded unless folded.nil? kw = {} kw[:min_count] = min_count unless min_count.nil? kw[:fill_value] = fill_value unless fill_value.nil? sliding_view.#{op}(axis: @window_axes, **kw) end RUBY end |
#any(min_count: nil, fill_value: nil) ⇒ CArray
Whether any cell of each rolling is true.
408 409 410 411 412 413 414 415 416 417 418 419 420 |
# File 'lib/carray/window_iterator.rb', line 408 [:sum, :accumulate, :prod, :mean, :min, :max, :variance, :stddev, :all, :any, :variancep, :stddevp, :minmax, :min_index, :max_index].each do |op| class_eval <<~RUBY, __FILE__, __LINE__ + 1 def #{op} (min_count: nil, fill_value: nil) folded = fold_by_offset(:#{op}, min_count, fill_value) return folded unless folded.nil? kw = {} kw[:min_count] = min_count unless min_count.nil? kw[:fill_value] = fill_value unless fill_value.nil? sliding_view.#{op}(axis: @window_axes, **kw) end RUBY end |
#convolve(kernel, min_count: nil, fill_value: nil) ⇒ CArray
776 777 778 |
# File 'lib/carray/window_iterator.rb', line 776 def convolve (kernel, min_count: nil, fill_value: nil) correlate(reverse_all_axes(kernel), min_count: min_count, fill_value: fill_value) end |
#correlate(kernel, min_count: nil, fill_value: nil) ⇒ CArray
749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 |
# File 'lib/carray/window_iterator.rb', line 749 def correlate (kernel, min_count: nil, fill_value: nil) unless kernel.shape == @widths raise ArgumentError, "correlate: kernel shape #{kernel.shape.inspect} != " \ "window shape #{@widths.inspect}" end sv = sliding_view # Explicit broadcast of the kernel over the anchor axes: reshape to # 1 on every anchor axis, kernel width on every window axis (CArray forbids # implicit cross-ndim broadcast, so the shape is made explicit). kshape = ([1] * @sndim) + @widths # The product routes operand promotion through the single-source binop # coercion (result_type), so a float kernel over an int source promotes to # float instead of truncating the weights. Do not coerce the kernel here. prod = sv * kernel.reshape(*kshape) kw = {} kw[:min_count] = min_count unless min_count.nil? kw[:fill_value] = fill_value unless fill_value.nil? prod.sum(axis: @window_axes, **kw) end |
#count(v = <none>) ⇒ CArray
700 701 702 703 704 705 |
# File 'lib/carray/window_iterator.rb', line 700 def count (*args) return count_not_masked if args.empty? # The sliding_windows view is a CAStride, so its #count is not shadowed; # dispatch CArray#count explicitly anyway, matching the family regularity. CArray.instance_method(:count).bind_call(sliding_view, *args, axis: @window_axes) end |
#count_masked ⇒ CArray
718 719 720 |
# File 'lib/carray/window_iterator.rb', line 718 def count_masked sliding_view.count_masked(axis: @window_axes) end |
#count_not_masked ⇒ CArray
711 712 713 |
# File 'lib/carray/window_iterator.rb', line 711 def count_not_masked sliding_view.count_not_masked(axis: @window_axes) end |
#cumcount ⇒ Object
Not supported for a window iterator. A segment scan writes a per-cell running count of present cells, which is single-valued only when each cell belongs to exactly one piece. Overlapping windows put a cell in many windows, so there is no single running value. Raises NotImplementedError, exactly as #map / #sort_addr do (min / max reductions stay available: a single winner is well-defined).
1010 1011 1012 1013 1014 1015 1016 1017 1018 |
# File 'lib/carray/window_iterator.rb', line 1010 [:cumsum, :cumprod, :cummax, :cummin, :cumcount].each do |op| define_method(op) do |*, **| raise NotImplementedError, "#{self.class} has no #{op}: a segment scan needs each cell to " \ "belong to exactly one piece, but overlapping windows share cells, " \ "so a per-cell running value is ill-defined; use reduce for a " \ "custom per-window fold." end end |
#cummax ⇒ Object
Not supported for a window iterator. A segment scan writes a per-cell running maximum, which is single-valued only when each cell belongs to exactly one piece. Overlapping windows put a cell in many windows, so there is no single running value. Raises NotImplementedError, exactly as #map / #sort_addr do (min / max reductions stay available: a single winner is well-defined).
1010 1011 1012 1013 1014 1015 1016 1017 1018 |
# File 'lib/carray/window_iterator.rb', line 1010 [:cumsum, :cumprod, :cummax, :cummin, :cumcount].each do |op| define_method(op) do |*, **| raise NotImplementedError, "#{self.class} has no #{op}: a segment scan needs each cell to " \ "belong to exactly one piece, but overlapping windows share cells, " \ "so a per-cell running value is ill-defined; use reduce for a " \ "custom per-window fold." end end |
#cummin ⇒ Object
Not supported for a window iterator. A segment scan writes a per-cell running minimum, which is single-valued only when each cell belongs to exactly one piece. Overlapping windows put a cell in many windows, so there is no single running value. Raises NotImplementedError, exactly as #map / #sort_addr do (min / max reductions stay available: a single winner is well-defined).
1010 1011 1012 1013 1014 1015 1016 1017 1018 |
# File 'lib/carray/window_iterator.rb', line 1010 [:cumsum, :cumprod, :cummax, :cummin, :cumcount].each do |op| define_method(op) do |*, **| raise NotImplementedError, "#{self.class} has no #{op}: a segment scan needs each cell to " \ "belong to exactly one piece, but overlapping windows share cells, " \ "so a per-cell running value is ill-defined; use reduce for a " \ "custom per-window fold." end end |
#cumprod ⇒ Object
Not supported for a window iterator. A segment scan writes a per-cell running product, which is single-valued only when each cell belongs to exactly one piece. Overlapping windows put a cell in many windows, so there is no single running value. Raises NotImplementedError, exactly as #map / #sort_addr do (min / max reductions stay available: a single winner is well-defined).
1010 1011 1012 1013 1014 1015 1016 1017 1018 |
# File 'lib/carray/window_iterator.rb', line 1010 [:cumsum, :cumprod, :cummax, :cummin, :cumcount].each do |op| define_method(op) do |*, **| raise NotImplementedError, "#{self.class} has no #{op}: a segment scan needs each cell to " \ "belong to exactly one piece, but overlapping windows share cells, " \ "so a per-cell running value is ill-defined; use reduce for a " \ "custom per-window fold." end end |
#cumsum ⇒ Object
Not supported for a window iterator. A segment scan writes a per-cell running sum, which is single-valued only when each cell belongs to exactly one piece. Overlapping windows put a cell in many windows, so there is no single running value. Raises NotImplementedError, exactly as #map / #sort_addr do (min / max reductions stay available: a single winner is well-defined).
1010 1011 1012 1013 1014 1015 1016 1017 1018 |
# File 'lib/carray/window_iterator.rb', line 1010 [:cumsum, :cumprod, :cummax, :cummin, :cumcount].each do |op| define_method(op) do |*, **| raise NotImplementedError, "#{self.class} has no #{op}: a segment scan needs each cell to " \ "belong to exactly one piece, but overlapping windows share cells, " \ "so a per-cell running value is ill-defined; use reduce for a " \ "custom per-window fold." end end |
#each({ |window| ... }) {|window| ... } ⇒ Enumerator, self
906 907 908 909 910 911 912 |
# File 'lib/carray/window_iterator.rb', line 906 def each return to_enum(:each) unless block_given? sv = sliding_view nils = Array.new(@sndim, nil) # full window on the trailing axes each_anchor_index { |idx| yield sv[*idx, *nils] } self end |
#elements ⇒ CArray
726 727 728 729 730 731 732 733 |
# File 'lib/carray/window_iterator.rb', line 726 def elements sz = @widths.inject(1) { |p, w| p * w } # count_not_masked gives the correct output shape (and is not shadowed); # overwrite with the constant window size. out = sliding_view.count_not_masked(axis: @window_axes) out[] = sz out end |
#map ⇒ Object
949 950 951 952 953 954 |
# File 'lib/carray/window_iterator.rb', line 949 def map (*) raise NotImplementedError, "#{self.class} has no map: overlapping windows share cells, so an " \ "element-wise scatter-back is ill-defined; use reduce for a custom " \ "per-window fold." end |
#max(min_count: nil, fill_value: nil) ⇒ CArray
Rolling maximum.
408 409 410 411 412 413 414 415 416 417 418 419 420 |
# File 'lib/carray/window_iterator.rb', line 408 [:sum, :accumulate, :prod, :mean, :min, :max, :variance, :stddev, :all, :any, :variancep, :stddevp, :minmax, :min_index, :max_index].each do |op| class_eval <<~RUBY, __FILE__, __LINE__ + 1 def #{op} (min_count: nil, fill_value: nil) folded = fold_by_offset(:#{op}, min_count, fill_value) return folded unless folded.nil? kw = {} kw[:min_count] = min_count unless min_count.nil? kw[:fill_value] = fill_value unless fill_value.nil? sliding_view.#{op}(axis: @window_axes, **kw) end RUBY end |
#max_addr ⇒ CArray
436 |
# File 'lib/carray/window_iterator.rb', line 436 def max_addr; window_winner_addr(:max_index); end |
#max_index(min_count: nil, fill_value: nil) ⇒ CArray
Rolling position of the maximum, local to the window axes.
408 409 410 411 412 413 414 415 416 417 418 419 420 |
# File 'lib/carray/window_iterator.rb', line 408 [:sum, :accumulate, :prod, :mean, :min, :max, :variance, :stddev, :all, :any, :variancep, :stddevp, :minmax, :min_index, :max_index].each do |op| class_eval <<~RUBY, __FILE__, __LINE__ + 1 def #{op} (min_count: nil, fill_value: nil) folded = fold_by_offset(:#{op}, min_count, fill_value) return folded unless folded.nil? kw = {} kw[:min_count] = min_count unless min_count.nil? kw[:fill_value] = fill_value unless fill_value.nil? sliding_view.#{op}(axis: @window_axes, **kw) end RUBY end |
#mean(min_count: nil, fill_value: nil) ⇒ CArray
Rolling arithmetic mean.
408 409 410 411 412 413 414 415 416 417 418 419 420 |
# File 'lib/carray/window_iterator.rb', line 408 [:sum, :accumulate, :prod, :mean, :min, :max, :variance, :stddev, :all, :any, :variancep, :stddevp, :minmax, :min_index, :max_index].each do |op| class_eval <<~RUBY, __FILE__, __LINE__ + 1 def #{op} (min_count: nil, fill_value: nil) folded = fold_by_offset(:#{op}, min_count, fill_value) return folded unless folded.nil? kw = {} kw[:min_count] = min_count unless min_count.nil? kw[:fill_value] = fill_value unless fill_value.nil? sliding_view.#{op}(axis: @window_axes, **kw) end RUBY end |
#median ⇒ CArray
809 810 811 |
# File 'lib/carray/window_iterator.rb', line 809 def median order_stat { |view, axis| view.median(axis: axis) } end |
#min(min_count: nil, fill_value: nil) ⇒ CArray
Rolling minimum.
408 409 410 411 412 413 414 415 416 417 418 419 420 |
# File 'lib/carray/window_iterator.rb', line 408 [:sum, :accumulate, :prod, :mean, :min, :max, :variance, :stddev, :all, :any, :variancep, :stddevp, :minmax, :min_index, :max_index].each do |op| class_eval <<~RUBY, __FILE__, __LINE__ + 1 def #{op} (min_count: nil, fill_value: nil) folded = fold_by_offset(:#{op}, min_count, fill_value) return folded unless folded.nil? kw = {} kw[:min_count] = min_count unless min_count.nil? kw[:fill_value] = fill_value unless fill_value.nil? sliding_view.#{op}(axis: @window_axes, **kw) end RUBY end |
#min_addr ⇒ CArray
431 |
# File 'lib/carray/window_iterator.rb', line 431 def min_addr; window_winner_addr(:min_index); end |
#min_index(min_count: nil, fill_value: nil) ⇒ CArray
Rolling position of the minimum, local to the window axes.
408 409 410 411 412 413 414 415 416 417 418 419 420 |
# File 'lib/carray/window_iterator.rb', line 408 [:sum, :accumulate, :prod, :mean, :min, :max, :variance, :stddev, :all, :any, :variancep, :stddevp, :minmax, :min_index, :max_index].each do |op| class_eval <<~RUBY, __FILE__, __LINE__ + 1 def #{op} (min_count: nil, fill_value: nil) folded = fold_by_offset(:#{op}, min_count, fill_value) return folded unless folded.nil? kw = {} kw[:min_count] = min_count unless min_count.nil? kw[:fill_value] = fill_value unless fill_value.nil? sliding_view.#{op}(axis: @window_axes, **kw) end RUBY end |
#minmax(min_count: nil, fill_value: nil) ⇒ Array<CArray>
Rolling minimum and maximum, found in one pass.
408 409 410 411 412 413 414 415 416 417 418 419 420 |
# File 'lib/carray/window_iterator.rb', line 408 [:sum, :accumulate, :prod, :mean, :min, :max, :variance, :stddev, :all, :any, :variancep, :stddevp, :minmax, :min_index, :max_index].each do |op| class_eval <<~RUBY, __FILE__, __LINE__ + 1 def #{op} (min_count: nil, fill_value: nil) folded = fold_by_offset(:#{op}, min_count, fill_value) return folded unless folded.nil? kw = {} kw[:min_count] = min_count unless min_count.nil? kw[:fill_value] = fill_value unless fill_value.nil? sliding_view.#{op}(axis: @window_axes, **kw) end RUBY end |
#percentile(*pers) ⇒ CArray+
818 819 820 |
# File 'lib/carray/window_iterator.rb', line 818 def percentile (*pers) order_stat { |view, axis| view.percentile(*pers, axis: axis) } end |
#prod(min_count: nil, fill_value: nil) ⇒ CArray
Rolling product.
408 409 410 411 412 413 414 415 416 417 418 419 420 |
# File 'lib/carray/window_iterator.rb', line 408 [:sum, :accumulate, :prod, :mean, :min, :max, :variance, :stddev, :all, :any, :variancep, :stddevp, :minmax, :min_index, :max_index].each do |op| class_eval <<~RUBY, __FILE__, __LINE__ + 1 def #{op} (min_count: nil, fill_value: nil) folded = fold_by_offset(:#{op}, min_count, fill_value) return folded unless folded.nil? kw = {} kw[:min_count] = min_count unless min_count.nil? kw[:fill_value] = fill_value unless fill_value.nil? sliding_view.#{op}(axis: @window_axes, **kw) end RUBY end |
#quantile ⇒ Array<CArray>
826 827 828 |
# File 'lib/carray/window_iterator.rb', line 826 def quantile order_stat { |view, axis| view.quantile(axis: axis) } end |
#reduce({ |window| ... }) {|window| ... } ⇒ CArray #reduce(init) ⇒ CArray
925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 |
# File 'lib/carray/window_iterator.rb', line 925 def reduce (*args, data_type: nil, &blk) raise LocalJumpError, "no block given (yield)" unless blk dt = data_type || CA_OBJECT out = CArray.new(dt, @shape) sv = sliding_view nils = Array.new(@sndim, nil) # full window on the trailing axes if args.empty? each_anchor_index { |idx| out[*idx] = blk.call(sv[*idx, *nils]) } else init = args[0] each_anchor_index do |idx| acc = init sv[*idx, *nils].each { |e| acc = blk.call(acc, e) } out[*idx] = acc end end out end |
#sliding_view ⇒ CArray
160 161 162 |
# File 'lib/carray/window_iterator.rb', line 160 def sliding_view @sliding_view ||= anchored_buffer.sliding_windows(*@widths) end |
#sort_addr ⇒ Object
963 964 965 966 967 968 |
# File 'lib/carray/window_iterator.rb', line 963 def sort_addr (*) raise NotImplementedError, "#{self.class} has no sort_addr: padded boundary cells have no " \ "source address and overlapping windows share cells, so a per-window " \ "sort of source addresses is ill-defined." end |
#stddev(min_count: nil, fill_value: nil) ⇒ CArray
Rolling sample standard deviation (divisor n - 1).
408 409 410 411 412 413 414 415 416 417 418 419 420 |
# File 'lib/carray/window_iterator.rb', line 408 [:sum, :accumulate, :prod, :mean, :min, :max, :variance, :stddev, :all, :any, :variancep, :stddevp, :minmax, :min_index, :max_index].each do |op| class_eval <<~RUBY, __FILE__, __LINE__ + 1 def #{op} (min_count: nil, fill_value: nil) folded = fold_by_offset(:#{op}, min_count, fill_value) return folded unless folded.nil? kw = {} kw[:min_count] = min_count unless min_count.nil? kw[:fill_value] = fill_value unless fill_value.nil? sliding_view.#{op}(axis: @window_axes, **kw) end RUBY end |
#stddevp(min_count: nil, fill_value: nil) ⇒ CArray
Rolling population standard deviation (divisor n).
408 409 410 411 412 413 414 415 416 417 418 419 420 |
# File 'lib/carray/window_iterator.rb', line 408 [:sum, :accumulate, :prod, :mean, :min, :max, :variance, :stddev, :all, :any, :variancep, :stddevp, :minmax, :min_index, :max_index].each do |op| class_eval <<~RUBY, __FILE__, __LINE__ + 1 def #{op} (min_count: nil, fill_value: nil) folded = fold_by_offset(:#{op}, min_count, fill_value) return folded unless folded.nil? kw = {} kw[:min_count] = min_count unless min_count.nil? kw[:fill_value] = fill_value unless fill_value.nil? sliding_view.#{op}(axis: @window_axes, **kw) end RUBY end |
#sum(min_count: nil, fill_value: nil) ⇒ CArray
Rolling sum.
408 409 410 411 412 413 414 415 416 417 418 419 420 |
# File 'lib/carray/window_iterator.rb', line 408 [:sum, :accumulate, :prod, :mean, :min, :max, :variance, :stddev, :all, :any, :variancep, :stddevp, :minmax, :min_index, :max_index].each do |op| class_eval <<~RUBY, __FILE__, __LINE__ + 1 def #{op} (min_count: nil, fill_value: nil) folded = fold_by_offset(:#{op}, min_count, fill_value) return folded unless folded.nil? kw = {} kw[:min_count] = min_count unless min_count.nil? kw[:fill_value] = fill_value unless fill_value.nil? sliding_view.#{op}(axis: @window_axes, **kw) end RUBY end |
#variance(min_count: nil, fill_value: nil) ⇒ CArray
Rolling sample variance (divisor n - 1).
408 409 410 411 412 413 414 415 416 417 418 419 420 |
# File 'lib/carray/window_iterator.rb', line 408 [:sum, :accumulate, :prod, :mean, :min, :max, :variance, :stddev, :all, :any, :variancep, :stddevp, :minmax, :min_index, :max_index].each do |op| class_eval <<~RUBY, __FILE__, __LINE__ + 1 def #{op} (min_count: nil, fill_value: nil) folded = fold_by_offset(:#{op}, min_count, fill_value) return folded unless folded.nil? kw = {} kw[:min_count] = min_count unless min_count.nil? kw[:fill_value] = fill_value unless fill_value.nil? sliding_view.#{op}(axis: @window_axes, **kw) end RUBY end |
#variancep(min_count: nil, fill_value: nil) ⇒ CArray
Rolling population variance (divisor n).
408 409 410 411 412 413 414 415 416 417 418 419 420 |
# File 'lib/carray/window_iterator.rb', line 408 [:sum, :accumulate, :prod, :mean, :min, :max, :variance, :stddev, :all, :any, :variancep, :stddevp, :minmax, :min_index, :max_index].each do |op| class_eval <<~RUBY, __FILE__, __LINE__ + 1 def #{op} (min_count: nil, fill_value: nil) folded = fold_by_offset(:#{op}, min_count, fill_value) return folded unless folded.nil? kw = {} kw[:min_count] = min_count unless min_count.nil? kw[:fill_value] = fill_value unless fill_value.nil? sliding_view.#{op}(axis: @window_axes, **kw) end RUBY end |
#wmean(weights) ⇒ CArray
868 869 870 |
# File 'lib/carray/window_iterator.rb', line 868 def wmean (weights) weighted(weights) { |sv, w, axis| sv.wmean(w, axis: axis) } end |
#wsum(weights) ⇒ CArray
861 862 863 |
# File 'lib/carray/window_iterator.rb', line 861 def wsum (weights) weighted(weights) { |sv, w, axis| sv.wsum(w, axis: axis) } end |