class NArrayMiss

Constants

BYTE

Class Constants

COMPLEX
FLOAT
INT
OBJECT
SCOMPLEX
SFLOAT
SINT
VERSION

Public Class Methods

[](*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 147
def self.[](*arg)
  NArrayMiss.to_nam(NArray[*arg])
end
__new__(*arg)
Alias for: new
_load(o) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1250
def self._load(o)
  ary, mask = Marshal::load(o)
  ary = NArray._load(ary)
  mask = NArray._load(mask)
  NArrayMiss.to_nam_no_dup(ary,mask)
end
byte(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 123
def self.byte(*arg)
  NArrayMiss.new(BYTE,*arg)
end
complex(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 141
def self.complex(*arg)
  NArrayMiss.new(COMPLEX,*arg)
end
float(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 135
def self.float(*arg)
  NArrayMiss.new(FLOAT,*arg)
end
int(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 129
def self.int(*arg)
  NArrayMiss.new(INT,*arg)
end
new(*arg) click to toggle source

Class Methods

# File lib/narray_miss/narray_miss.rb, line 118
def self.new(*arg)
  array = NArray.new(*arg)
  mask = NArray.byte(*arg[1..-1])
  __new__(array, mask)
end
Also aliased as: __new__
new(array, mask) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 77
def initialize(array, mask)
  if array.shape!=mask.shape
    raise "array and mask must have the same shape"
  end
  @array = array
  @mask = mask
end
object(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 144
def self.object(*arg)
  NArrayMiss.new(OBJECT,*arg)
end
scomplex(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 138
def self.scomplex(*arg)
  NArrayMiss.new(SCOMPLEX,*arg)
end
sfloat(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 132
def self.sfloat(*arg)
  NArrayMiss.new(SFLOAT,*arg)
end
sint(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 126
def self.sint(*arg)
  NArrayMiss.new(SINT,*arg)
end
to_nam(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 185
def self.to_nam(*arg)
  if !(Numeric===arg[0]) && !(Array===arg[0]) && !arg[0].is_a?(NArray)
    raise "first argument must be Numeric, NArray or Array"
  end
  arg[0] = arg[0].dup if !(Numeric===arg[0])
  if arg.length==2 && !(Numeric===arg[1]) && arg[1].class!=TrueClass && arg[1].class!=FalseClass then
    arg[1] = arg[1].dup
  end
  NArrayMiss.to_nam_no_dup(*arg)
end
to_nam_no_dup(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 150
def self.to_nam_no_dup(*arg)
  if arg.length > 2 || arg.length==0 then
    raise("NArrayMiss.to_nar( array [,mask]] )")
  end

  array = arg[0]
  if Numeric===array then array = NArray[array] end
  if Array===array then array = NArray.to_na(array) end
  if !array.is_a?(NArray) then
    raise("argument must be Numeric, NArray or Array")
  end

  if arg.length==2 then
    mask = arg[1]
    if Numeric===mask then mask = array.ne(mask) end
    if Array===mask then
      mask = NArray.to_na(mask).ne(0)
    end
    if mask.class == FalseClass then
      mask = NArray.byte(*array.shape)
    end
    if mask.class == TrueClass then
      mask = NArray.byte(*array.shape).fill(1)
    end
    if !(NArray===mask && mask.typecode==BYTE) then
        raise("mask must be Numeric, Array, true, false or NArray(byte)")
    end
    if mask.length!=array.length
      raise "mask.length must be same as array.length"
    end
  else
    mask = NArray.byte(*array.shape).fill(1)
  end
  __new__(array,mask)
end

Private Class Methods

check_options(arg, default_mincount) click to toggle source

引数にオプション (Hash) が指定されているかチェックし、 されている場合は、オプションを取得し戻り値として返す。 現時点では、オプションは “min_count” のみ

# File lib/narray_miss/narray_miss.rb, line 1348
def self.check_options(arg, default_mincount)
  min_count = default_mincount
  options = %w(min_count)
  if arg.length!=0 && arg[-1].kind_of?(Hash)
    option = arg.pop
    option.each_key{|key|
      if !options.index(key) then
        raise(ArgumentError,key+" option is not exist")
      end
    }
    min_count = option["min_count"] || default_mincount
    min_count = min_count.to_i
    if min_count < default_mincount
      raise(ArgumentError, "min_count must be >= #{default_mincount}")
    end
  end
  return min_count
end
reduction(mask, rank, min_count, dims, flag, typecode) { |count_sum, count_accum| ... } click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1307
def self.reduction(mask, rank, min_count, dims, flag, typecode)
  # flag: リダクションを行う次元方向の有効な値の個数で、割り算を行うかどうかのフラグ
  count_sum = mask.to_type(NArray::LINT).sum(*dims)
  # 返り値が配列か、スカラーかによって分岐
  if count_sum.kind_of?(NArray)
    mask = count_sum.ge(min_count)
    # すべての要素が欠損値にならないかチェック
    if mask.any?
      count_accum = NArray.ref(count_sum)
      dims.collect{|d|d<0 ? d+rank : d}.sort.each do |d|
        count_accum.newdim!(d)
      end
      # 割り算を行う場合は、先に count_sum を NArrayMiss 化
      #   yield の戻り値は NArrayMiss
      # 割り算を行わない場合は、後で NArrayMiss 化
      #   yield の戻り値は NArray
      count_sum = NArrayMiss.to_nam_no_dup(count_sum,mask) if flag
      ary = yield(count_sum, count_accum)
      ary = NArrayMiss.to_nam_no_dup(ary, mask) unless flag
    else
      # すべての要素が欠損値の NArrayMiss を返す
      na = NArray.new(typecode, *mask.shape)
      ary = NArrayMiss.to_nam_no_dup(na, false)
    end
  else
    # 有効な要素数があるかチェック
    if count_sum >= min_count
      count_accum = NArray.int(*([1]*mask.rank)).fill!(count_sum)
      ary = yield(count_sum, count_accum)
    else
      # 有効な要素数が足りない場合は nil を返す
      return nil
    end
  end
  return ary
end

Public Instance Methods

%(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 396
def %(arg)
  binary_operation(arg, 1){|t1, t2| t1 % t2}
end
&(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 445
def &(arg)
  binary_operation(arg, 1){|t1, t2| t1 & t2}
end
*(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 390
def *(arg)
  binary_operation(arg, 1){|t1, t2| t1 * t2}
end
**(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 399
def **(arg)
  binary_operation(arg, 1){|t1, t2| t1 ** t2}
end
+(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 384
def +(arg)
  binary_operation(arg, 0){|t1, t2| t1 + t2}
end
-(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 387
def -(arg)
  binary_operation(arg, 0){|t1, t2| t1 - t2}
end
-@() click to toggle source

Arithmetic operator

# File lib/narray_miss/narray_miss.rb, line 379
def -@
  array = @array.dup
  array[@mask] = -@array[@mask]
  NArrayMiss.to_nam_no_dup(array, @mask.dup)
end
/(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 393
def /(arg)
  binary_operation(arg, 1){|t1, t2| t1 / t2}
end
==(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 507
def ==(arg)
  if arg.kind_of?(NArrayMiss) then
    @mask==arg.get_mask! && @array[@mask]==arg.get_array![@mask]
  else
    false
  end
end
[](*arg) click to toggle source

Slicing Array

# File lib/narray_miss/narray_miss.rb, line 262
def [](*arg)
  if arg[0].class == NArrayMiss && arg[0].typecode == BYTE
    obj = @array[arg[0].to_na(0)]
    if Numeric===obj
      return obj
    else
      return NArrayMiss.to_nam_no_dup(obj)
    end
  else
    obj = @array[*arg]
    if Numeric===obj
      return obj
    else
      return NArrayMiss.to_nam_no_dup(obj,@mask[*arg])
    end
  end
end
[]=(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 306
def []=(*arg)
  if arg.length == 2 && arg[0].class == NArrayMiss && arg[0].typecode == BYTE
    idx = arg[0].to_na(0)
    self.set_without_validation(idx,arg[-1])
    if arg[-1].class != NArrayMiss && arg[-1] then
      @mask[idx] = 1
    end
  else
    self.set_without_validation(*arg)
    if arg[-1].class != NArrayMiss && arg[-1] then
      if arg.length==1 then
        @mask=1
      else
        @mask[*arg[0..-2]] = 1
      end
    end
  end
  return self
end
^(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 451
def ^(arg)
  binary_operation(arg, 1){|t1, t2| t1 ^ t2}
end
__clone__()
Alias for: clone
_dump(limit) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1247
def _dump(limit)
  Marshal::dump([@array._dump(nil),@mask._dump(nil)])
end
abs() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 403
def abs
  array = @array.dup
  array[@mask] = @array[@mask].abs
  NArrayMiss.to_nam_no_dup(array, @mask.dup)
end
accum(*arg) click to toggle source

Statistics

# File lib/narray_miss/narray_miss.rb, line 546
def accum(*arg)
  if @mask.count_true == 0 then
    return nil
  else
    array = @array.dup
    array[@mask.not] = 0
    return NArrayMiss.to_nam_no_dup(array.accum(*arg),
                             @mask.to_type(NArray::INT).accum(*arg).ne(0))
  end
end
add!(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 409
def add!(arg)
  binary_operation(arg, 0){|t1, t2| t1.add!(t2)}
end
all?() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 904
def all?
  @array[@mask].all?
end
all_invalid() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1044
def all_invalid
  @mask[true]=0
  self
end
all_invalid?()
Alias for: none_valid?
all_valid() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1040
def all_valid
  @mask[true]=1
  self
end
all_valid?() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1111
def all_valid?
  @mask.all?
end
and(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 493
def and(arg)
  binary_operation(arg, 1){|t1, t2| t1.and t2}
end
angle() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 943
def angle
  NArrayMiss.to_nam_no_dup(@array.angle,@mask)
end
any?() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 907
def any?
  @array[@mask].any?
end
any_valid?() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1118
def any_valid?
  @mask.any?
end
ceil() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 783
def ceil
  NArrayMiss.to_nam_no_dup(@array.ceil, @mask.dup)
end
clone() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1165
def clone
  obj = __clone__
  obj.set_array(@array.clone)
  obj.set_mask(@mask.clone)
  return obj
end
Also aliased as: __clone__
coerce(x) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1172
def coerce(x)
  if Numeric===x then
    return [NArrayMiss.new(NArray[x].typecode,*self.shape).fill(x),self]
  elsif x.class==Array || x.class==NArray then
    return [NArrayMiss.to_nam(x), self]
  else
    raise("donnot know how to cange #{x.class} to NArrayMiss")
  end
end
collect(&blk) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 856
def collect(&blk)
  self.dup.collect!(&blk)
end
collect!() { |self| ... } click to toggle source
# File lib/narray_miss/narray_miss.rb, line 850
def collect!
  for i in 0..self.total-1
    self[i] = yield(self[i])
  end
  self
end
complex?() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1155
def complex?
  @array.complex?
end
conj() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 940
def conj
  NArrayMiss.to_nam_no_dup(@array.conj,@mask)
end
count_false() click to toggle source

Boolean and mask related (only for byte, sint and int)

# File lib/narray_miss/narray_miss.rb, line 882
def count_false
  if @array.typecode==BYTE then
    return @array.count_false-@mask.count_false
  else
    raise("cannot count_true NArrayMiss except BYTE type")
  end
end
count_invalid(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1129
def count_invalid(*arg)
  if arg.length==0 then
    return @mask.count_false
  else
    return NArray.int(*@mask.shape).fill(1).sum(*arg)-
           @mask.to_type(NArray::INT).sum(*arg)
  end
end
count_true() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 889
def count_true
  if @array.typecode==BYTE then
    return (@array&@mask).count_true
  else
    raise("cannot count_true NArrayMiss except BYTE type")
  end
end
count_valid(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1122
def count_valid(*arg)
  if arg.length==0 then
    return @mask.count_true
  else
    return @mask.to_type(NArray::INT).sum(*arg)
  end    
end
dim() click to toggle source

NArrayMiss information

# File lib/narray_miss/narray_miss.rb, line 222
def dim
  @array.dim
end
div!(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 418
def div!(arg)
  binary_operation(arg, 1){|t1, t2| t1.div!(t2)}
end
dup() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1160
def dup
  NArrayMiss.to_nam(@array,@mask)
end
each() { |array| ... } click to toggle source

Iteration

# File lib/narray_miss/narray_miss.rb, line 835
def each
  for i in 0..self.total-1
    yield(@array[i])
  end
end
each_valid() { |array| ... } click to toggle source
# File lib/narray_miss/narray_miss.rb, line 840
def each_valid
  for i in 0..self.total-1
    yield(@array[i]) if @mask[i]
  end
end
each_valid_with_index() { |array,i| ... } click to toggle source
# File lib/narray_miss/narray_miss.rb, line 845
def each_valid_with_index
  for i in 0..self.total-1
    yield(@array[i],i) if @mask[i]
  end
end
eq(arg) click to toggle source

Comparison

# File lib/narray_miss/narray_miss.rb, line 474
def eq(arg)
  binary_operation(arg, 0){|t1, t2| t1.eq t2}
end
floor() click to toggle source

Type conversion

# File lib/narray_miss/narray_miss.rb, line 780
def floor
  NArrayMiss.to_nam_no_dup(@array.floor, @mask.dup)
end
ge(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 483
def ge(arg)
  binary_operation(arg, 0){|t1, t2| t1.ge t2}
end
get_array() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1089
def get_array
  @array.dup
end
get_array!() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1086
def get_array!
  @array
end
get_mask() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1083
def get_mask
  @mask.dup
end
get_mask!() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1080
def get_mask!
  @mask
end
gt(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 480
def gt(arg)
  binary_operation(arg, 0){|t1, t2| t1.gt t2}
end
hton() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 974
def hton
  NArrayMiss.to_nam(@array.hton,@mask.hton)
end
Also aliased as: ntoh
htov() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 978
def htov
  NArrayMiss.to_nam(@array.htov,@mask.htov)
end
Also aliased as: vtoh
im() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 950
def im
  NArrayMiss.to_nam_no_dup(@array.im,@mask)
end
imag() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 937
def imag
  NArrayMiss.to_nam_no_dup(@array.imag,@mask)
end
imag=(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 946
def imag=(arg)
  @array.image=(arg)
  self
end
inspect() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1183
  def inspect
#    "array -> " + @array.inspect + "\nmask  -> " + @mask.inspect
    count_line = 0
    max_line = 10
    max_col = 80
    sep = ", "
    const = Hash.new
    NArray.constants.each{|c| const[NArray.const_get(c)] = c}
    str_ret = "NArrayMiss."+const[typecode].to_s.downcase+"("+shape.join(",")+"):"
    if rank == 0 then
      str_ret << " []"
      return str_ret
    else
       str_ret << "\n"
    end
    str = ""
    index = Array.new(rank,0)
    index[0] = true
    i = 1
    (rank-1).times{ str_ret << "[ " }
    while(true)
      i.times{ str_ret << "[ " }

      str = @array[*index].inspect
      ary = str[str.index("[")+1..str.index("]")-1].strip.split(/\s*,\s*/)
      miss = @mask[*index].where2[1]
      miss = miss[miss<ary.length].to_a
      if ary[-1]=="..." && miss[-1]==ary.length-1 then miss.pop end
      for j in miss
        ary[j] = "-"
      end
      while ( rank*4+ary.join(", ").length > max_col )
        ary.pop
        ary[-1] = "..."
      end
      str_ret << ary.join(", ")
      i = 1
      while (i<rank)
        if index[i]<shape[i]-1 then
          str_ret << " ]" << sep << "\n"
          count_line += 1
          index[i] += 1
          break
        else
          str_ret << " ]"
          index[i] = 0
          i += 1
        end
      end

      if i>=rank then
        str_ret << " ]"
        return str_ret
      elsif count_line>=max_line then
        str_ret << " ..."
        return str_ret
      end

      (rank-i).times{ str_ret << "  " }
    end
    return str_ret
  end
integer?() click to toggle source

Others

# File lib/narray_miss/narray_miss.rb, line 1152
def integer?
  @array.integer?
end
invalidation(*pos)
Alias for: set_invalid
le(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 489
def le(arg)
  binary_operation(arg, 0){|t1, t2| t1.le t2}
end
length()
Alias for: size
lt(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 486
def lt(arg)
  binary_operation(arg, 0){|t1, t2| t1.lt t2}
end
mask(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 896
def mask(arg)
  obj = self.dup
  if arg.class==NArrayMiss then
    arg = arg.get_array!&arg.get_mask!
  end
  obj.set_mask(@mask&arg)
end
max(*dims) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 576
def max(*dims)
  min_count = NArrayMiss.check_options(dims, 1)
  # 欠損値に最小値を入れて普通に max する
  # byte,sint,int,sfloat,float の MIN の値を入れるように変更すべき
  ary0 = @array.dup
  ary0[@mask.not] = @array.min
  NArrayMiss.reduction(@mask, rank, min_count, dims, false, typecode) do
    ary0.max(*dims)
  end
end
mean(*dims) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 587
def mean(*dims)
  min_count = NArrayMiss.check_options(dims, 1)
  # 整数型の場合は浮動小数型へ変換
  ary0 = self.integer? ? self.to_type(NArray::DFLOAT) : self
  NArrayMiss.reduction(@mask, rank, min_count, dims, true, typecode) do |count_sum, count_accum|
    ary0.sum(*dims)/count_sum
  end
end
median(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 628
def median(*arg)
  if arg.length==0 then
    return @array[@mask].median
  else
    nshape = NArray.to_na(@array.shape)
    nshape[arg]=1
    nslice = nshape[nshape.ne(1).where]
    index = NArray.object(@mask.rank)
    index[nshape.eq(1).where] = true
    obj = NArrayMiss.new(@array.typecode,*nslice.to_a)
    total = 1
    nslice.each{|n| total *= n}
    for i in 0...total
      index[nshape.ne(1).where] = pos(i,nslice)
      mask = NArray.byte(*@array.shape).fill(0)
      mask[*index] = 1
      mask = @mask&mask
      if mask.count_true != 0 then
        obj[*pos(i,nslice)] = @array[mask].median
      end
    end
    return obj
  end
end
min(*dims) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 566
def min(*dims)
  min_count = NArrayMiss.check_options(dims, 1)
  # 欠損値に最大値を入れて普通に min する
  # byte,sint,int,sfloat,float の MAX の値を入れるように変更すべき
  ary0 = @array.dup
  ary0[@mask.not] = @array.max
  NArrayMiss.reduction(@mask, rank, min_count, dims, false, typecode) do
    ary0.min(*dims)
  end
end
mod!(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 421
def mod!(arg)
  binary_operation(arg, 1){|t1, t2| t1.mod!(t2)}
end
mul!(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 415
def mul!(arg)
  binary_operation(arg, 1){|t1, t2| t1.mul!(t2)}
end
mul_add(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 425
def mul_add(*arg)
  if arg.length==1 then
    return (self*arg[0]).sum
  else
    return (self*arg[0]).sum(*arg[1..-1])
  end
end
ne(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 477
def ne(arg)
  binary_operation(arg, 0){|t1, t2| t1.ne t2}
end
newdim(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 745
def newdim(*arg)
  obj = self.dup
  obj.newdim!(*arg)
end
Also aliased as: rewrank
newdim!(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 738
def newdim!(*arg)
  @array = @array.newdim!(*arg)
  @mask = @mask.newdim!(*arg)
  self
end
Also aliased as: rewrank!, rewrank=
none?() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 910
def none?
  @array[@mask].none?
end
none_valid?() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1114
def none_valid?
  @mask.none?
end
Also aliased as: all_invalid?
not() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 503
def not
  NArrayMiss.to_nam_no_dup(@array.not, @mask.dup)
end
ntoh()
Alias for: hton
or(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 496
def or(arg)
  binary_operation(arg, 0){|t1, t2| t1.or t2}
end
rank() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 225
def rank
  @array.rank
end
rank_total(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 237
def rank_total(*arg)
  @array.rank_total(*arg)
end
real() click to toggle source

Complex compound number (only for scomplex and complex)

# File lib/narray_miss/narray_miss.rb, line 934
def real
  NArrayMiss.to_nam_no_dup(@array.real,@mask)
end
reshape(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 733
def reshape(*arg)
  obj = self.dup
  obj.reshape!(*arg)
end
reshape!(*arg) click to toggle source

Changing Shapes of indices

# File lib/narray_miss/narray_miss.rb, line 728
def reshape!(*arg)
  @array = @array.reshape!(*arg)
  @mask = @mask.reshape!(*arg)
  self
end
Also aliased as: shape=
rewrank(*arg)
Alias for: newdim
rewrank!(*arg)
Alias for: newdim!
rewrank=(*arg)
Alias for: newdim!
rms(*dims) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 606
def rms(*dims)
  min_count = NArrayMiss.check_options(dims, 1)
  # 整数型の場合は浮動小数型へ変換
  ary0 = self.integer? ? self.to_type(NArray::DFLOAT) : self
  NArrayMiss.reduction(@mask, rank, min_count, dims, true, typecode) do |count_sum, count_accum|
    ary0 = ary0.abs if ary0.complex?
    ary0 = (ary0**2).sum(*dims) / count_sum
    NMMath.sqrt(ary0)
  end
end
rmsdev(*dims) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 616
def rmsdev(*dims)
  min_count = NArrayMiss.check_options(dims, 1)
  # 整数型の場合は浮動小数型へ変換
  ary0 = self.integer? ? self.to_type(NArray::DFLOAT) : self
  NArrayMiss.reduction(@mask, rank, min_count, dims, true, typecode) do |count_sum, count_accum|
    ary0 = ary0 - ary0.accum(*dims)/count_accum
    ary0 = ary0.abs if ary0.complex?
    ary0 = (ary0**2).sum(*dims) / count_sum
    NMMath.sqrt(ary0)
  end
end
round() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 786
def round
  NArrayMiss.to_nam_no_dup(@array.round, @mask.dup)
end
sbt!(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 412
def sbt!(arg)
  binary_operation(arg, 0){|t1, t2| t1.sbt!(t2)}
end
set_invalid(*pos) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1035
def set_invalid(*pos)
  @mask[*pos] = 0
  self
end
Also aliased as: invalidation
set_mask(mask) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1048
def set_mask(mask)
  if mask.class == Array then
    tmp = NArray.byte(*@mask.shape)
    tmp[true] = mask
    mask = tmp
  end
  if mask.class == NArrayMiss then
    mask = mask.to_na(0)
  end
  if mask.class == NArray then
    if mask.typecode != BYTE then
      raise("mask must be NArrayMiss.byte, NArray.byte or Array")
    end
    if @array.shape != mask.shape then
      raise("mask.shape must be same as array")
    end
    @mask = mask.dup
    return self
  else
    raise("mask must be NArray.byte or Array")
  end
end
set_missing_value(val) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1075
def set_missing_value(val)
  obj = self.dup
  obj.set_missing_value!(val)
end
set_missing_value!(val) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1071
def set_missing_value!(val)
  @array[@mask.not] = val
  self
end
set_valid(*pos) click to toggle source

Mask and missing value

# File lib/narray_miss/narray_miss.rb, line 1030
def set_valid(*pos)
  @mask[*pos] = 1
  self
end
Also aliased as: validation
set_without_validation(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 283
def set_without_validation(*arg)
  if arg.length==1 then
    if !arg[0] then
      @mask[] = 0
    elsif arg[0].class == NArrayMiss then
      @array[] = arg[0].get_array!
      @mask[] = arg[0].get_mask!
    else
      @array[] = arg[0]
    end
  else
    if !arg[-1] then
      @mask[*arg[0..-2]] = 0
    elsif arg[-1].class == NArrayMiss then
      @array[*arg[0..-2]] = arg[-1].get_array!
      @mask[*arg[0..-2]] = arg[-1].get_mask!
    else
      @array[*arg[0..-2]] = arg[-1]
    end
  end
  return self
end
shape() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 228
def shape
  @array.shape
end
shape=(*arg)
Alias for: reshape!
size() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 231
def size
  @array.size
end
Also aliased as: total, length
slice(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 279
def slice(*arg)
  NArrayMiss.to_nam_no_dup(@array.slice(*arg),@mask.slice(*arg))
end
stddev(*dims) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 595
def stddev(*dims)
  min_count = NArrayMiss.check_options(dims, 2)
  # 整数型の場合は浮動小数型へ変換
  ary0 = self.integer? ? self.to_type(NArray::DFLOAT) : self
  NArrayMiss.reduction(@mask, rank, min_count, dims, true, typecode) do |count_sum, count_accum|
    ary0 = ary0 - ary0.accum(*dims)/count_accum
    ary0 = ary0.abs if ary0.complex?
    ary0 = (ary0**2).sum(*dims) / (count_sum-1)
    NMMath.sqrt(ary0)
  end
end
sum(*dims) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 557
def sum(*dims)
  min_count = NArrayMiss.check_options(dims, 1)
  # 欠損値に 0 を入れて普通に sum する
  ary0 = @array.dup
  ary0[@mask.not] = 0
  NArrayMiss.reduction(@mask, rank, min_count, dims, false, typecode) do
    ary0.sum(*dims)
  end
end
swap_byte() click to toggle source

Byte swap

# File lib/narray_miss/narray_miss.rb, line 969
def swap_byte
  obj = self.dup
  obj.set_without_validation(@array.swap_byte)
  obj
end
to_a() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 799
def to_a
  @array.to_a
end
to_f() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 792
def to_f
  NArrayMiss.to_nam_no_dup(@array.to_f, @mask.dup)
end
to_i() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 789
def to_i
  NArrayMiss.to_nam_no_dup(@array.to_i, @mask.dup)
end
to_na(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 812
def to_na(*arg)
  return self.dup.to_na!(*arg)
end
to_na!(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 802
def to_na!(*arg)
  if arg.length==0
    return @array
  elsif arg.length==1 then
    self.set_missing_value!(arg[0])
    return @array
  else
    raise(ArgumentError, "Usage: NArray#to_na([missing_value])")
  end
end
to_s() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 815
def to_s
  @array.to_s
end
to_string() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 818
def to_string
  obj = NArrayMiss.obj(*@array.shape)
  obj.set_without_validation( @array.to_string )
  obh.set_mask(@mask)
  obj
end
to_type(typecode) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 796
def to_type(typecode)
  NArrayMiss.to_nam_no_dup(@array.to_type(typecode), @mask.dup)
end
total()
Alias for: size
transpose(*arg) click to toggle source

Transpose

# File lib/narray_miss/narray_miss.rb, line 700
def transpose(*arg)
  obj = self.dup
  shape = arg.collect{|i| obj.shape[i]}
  obj.reshape!(*shape)
  obj.set_without_validation( @array.transpose(*arg) )
  obj.set_mask(@mask.transpose(*arg))
  obj
end
typecode() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 241
def typecode
  @array.typecode
end
valid?(*arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1093
def valid?(*arg)
  if arg.any?
    # For the subset specified by the argument(s) (in the same way as for []).
    # Returns true or false if a single value is specified.
    # Otherwise, returns an Array of true of false
    mask = @mask[*arg]
    if mask.is_a?(Numeric)
      return mask == 1  # true if mask (==1); false if not
    end
  else
    # no argument
    mask = @mask
  end
  ary = mask.to_a
  ary.flatten!
  ary.map!{|i| i==1}  # true if element == 1; false if not
  return ary
end
validation(*pos)
Alias for: set_valid
vtoh()
Alias for: htov
where() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 914
def where
  (@array&@mask).where
end
where2() click to toggle source
# File lib/narray_miss/narray_miss.rb, line 917
def where2
  self.where-@mask.where
end
xor(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 499
def xor(arg)
  binary_operation(arg, 1){|t1, t2| t1.xor t2}
end
|(arg) click to toggle source
# File lib/narray_miss/narray_miss.rb, line 448
def |(arg)
  binary_operation(arg, 0){|t1, t2| t1 | t2}
end
~() click to toggle source

Bitwise operator (only for byte, sint and int)

# File lib/narray_miss/narray_miss.rb, line 442
def ~
  NArrayMiss.to_nam_to_dup(~@array, @mask.dup)
end

Private Instance Methods

binary_operation(arg, dummy) { |term1, term2| ... } click to toggle source
# File lib/narray_miss/narray_miss.rb, line 1274
def binary_operation(arg, dummy)
  # arg: 第2項目のオブジェクト
  # dummy: 演算を行っても結果に影響を与えない特別な値。(欠損部分に代入する)
  flag=true
  case arg
  when Numeric
    term1 = @array
    term2 = arg
    mask = @mask
  when Array, NArray
    term1 = @array.dup
    term1[@mask.not] = dummy # 欠損部分に dummy を代入
    term2 = arg.kind_of?(NArray) ? arg : NArray.to_na(arg) # Array -> NArray
    mask = NArray.byte(*term2.shape).fill(1) # 2項目は欠損無し
    mask = @mask & mask
  when NArrayMiss
    term1 = @array.dup
    term1[@mask.not] = dummy
    mask = arg.get_mask!
    term2 = arg.get_array
    term2[mask.not] = dummy
    mask = @mask & mask
  else
    term1, term2 = arg.coerce(self)
    # 演算を arg のクラスに任せるため、yield の結果をそのまま返す
    flag = false
  end
  result = yield(term1, term2)
  result = NArrayMiss.to_nam_no_dup(result, mask) if flag
  result
end
pos(n,shape) click to toggle source

private

# File lib/narray_miss/narray_miss.rb, line 1262
def pos(n,shape)
  rank = shape.length
  result = NArray.int(rank)
  m=n
  for i in 0..rank-2
    j = rank-1-i
    result[j] = m/shape[j-1]
    m = m%shape[j-1]
  end
  result[0] = m
  result
end