narray_miss 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/narray_miss/narray_miss.rb +45 -39
- data/lib/narray_miss/version.rb +1 -1
- data/narray_miss.gemspec +2 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad81e7b19996cde6cb259232a5d63498de4264ea
|
4
|
+
data.tar.gz: 6a6fcb1482ed57dd4305a90468a78062beb897ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a05718777eee5284f4ce9c202acaf0994976fc50ed6f8f7c6be95325fd9da2dc0beca71c0cd9de4744eb2c0c021a988fa31463133ac4674383f9fe3c2c314c4b
|
7
|
+
data.tar.gz: 0f350a12bff835850166279c8daff99cb3019c6da5ec96bcdf3e7d2c70e0de27f9ccbbd81c4e06623d0e167a3016765bd06ffa63693df7d3a220d7d57378b581
|
@@ -34,18 +34,26 @@ To use NArrayMiss class, you need invoking "require 'narray_miss.rb'" in your sc
|
|
34
34
|
|
35
35
|
=end
|
36
36
|
|
37
|
-
|
38
|
-
require 'numru/narray'
|
37
|
+
if defined?(NumRu::NArray)
|
39
38
|
NARRAY = NumRu::NArray
|
40
|
-
|
41
|
-
|
39
|
+
elsif defined?(NArray)
|
40
|
+
NARRAY = NArray
|
41
|
+
else
|
42
|
+
|
42
43
|
begin
|
43
44
|
require 'narray'
|
44
45
|
NARRAY = NArray
|
45
46
|
rescue LoadError
|
46
|
-
|
47
|
-
|
47
|
+
err = $!
|
48
|
+
begin
|
49
|
+
require 'numru/narray'
|
50
|
+
NARRAY = NumRu::NArray
|
51
|
+
rescue LoadError
|
52
|
+
STDERR.puts "You should install numru-narray or narray"
|
53
|
+
raise err
|
54
|
+
end
|
48
55
|
end
|
56
|
+
|
49
57
|
end
|
50
58
|
|
51
59
|
|
@@ -185,7 +193,7 @@ go back to ((<Index>))
|
|
185
193
|
array = arg[0]
|
186
194
|
if Numeric===array then array = NARRAY[array] end
|
187
195
|
if Array===array then array = NARRAY.to_na(array) end
|
188
|
-
|
196
|
+
unless array.is_a?(NARRAY) || /NArray/=~ array.class.to_s then
|
189
197
|
raise("argument must be Numeric, NArray or Array")
|
190
198
|
end
|
191
199
|
|
@@ -193,29 +201,26 @@ go back to ((<Index>))
|
|
193
201
|
mask = arg[1]
|
194
202
|
if Numeric===mask then mask = array.ne(mask) end
|
195
203
|
if Array===mask then
|
196
|
-
mask =
|
204
|
+
mask = array.class.to_na(mask).ne(0)
|
197
205
|
end
|
198
206
|
if mask.class == FalseClass then
|
199
|
-
mask =
|
207
|
+
mask = array.class.byte(*array.shape)
|
200
208
|
end
|
201
209
|
if mask.class == TrueClass then
|
202
|
-
mask =
|
210
|
+
mask = array.class.byte(*array.shape).fill(1)
|
203
211
|
end
|
204
|
-
if !(
|
212
|
+
if !(array.class===mask && mask.typecode==BYTE) then
|
205
213
|
raise("mask must be Numeric, Array, true, false or NArray(byte)")
|
206
214
|
end
|
207
215
|
if mask.length!=array.length
|
208
216
|
raise "mask.length must be same as array.length"
|
209
217
|
end
|
210
218
|
else
|
211
|
-
mask =
|
219
|
+
mask = array.class.byte(*array.shape).fill(1)
|
212
220
|
end
|
213
221
|
__new__(array,mask)
|
214
222
|
end
|
215
223
|
def self.to_nam(*arg)
|
216
|
-
if !(Numeric===arg[0]) && !(Array===arg[0]) && !arg[0].is_a?(NARRAY)
|
217
|
-
raise "first argument must be Numeric, NArray or Array"
|
218
|
-
end
|
219
224
|
arg[0] = arg[0].dup if !(Numeric===arg[0])
|
220
225
|
if arg.length==2 && !(Numeric===arg[1]) && arg[1].class!=TrueClass && arg[1].class!=FalseClass then
|
221
226
|
arg[1] = arg[1].dup
|
@@ -617,7 +622,7 @@ go back to ((<Index>))
|
|
617
622
|
def mean(*dims)
|
618
623
|
min_count = NArrayMiss.check_options(dims, 1)
|
619
624
|
# 整数型の場合は浮動小数型へ変換
|
620
|
-
ary0 = self.integer? ? self.to_type(
|
625
|
+
ary0 = self.integer? ? self.to_type(@array.class.const_get(:DFLOAT)) : self
|
621
626
|
NArrayMiss.reduction(@mask, rank, min_count, dims, true, typecode) do |count_sum, count_accum|
|
622
627
|
ary0.sum(*dims)/count_sum
|
623
628
|
end
|
@@ -625,7 +630,7 @@ go back to ((<Index>))
|
|
625
630
|
def stddev(*dims)
|
626
631
|
min_count = NArrayMiss.check_options(dims, 2)
|
627
632
|
# 整数型の場合は浮動小数型へ変換
|
628
|
-
ary0 = self.integer? ? self.to_type(
|
633
|
+
ary0 = self.integer? ? self.to_type(@array.class.const_get(:DFLOAT)) : self
|
629
634
|
NArrayMiss.reduction(@mask, rank, min_count, dims, true, typecode) do |count_sum, count_accum|
|
630
635
|
ary0 = ary0 - ary0.accum(*dims)/count_accum
|
631
636
|
ary0 = ary0.abs if ary0.complex?
|
@@ -636,7 +641,7 @@ go back to ((<Index>))
|
|
636
641
|
def rms(*dims)
|
637
642
|
min_count = NArrayMiss.check_options(dims, 1)
|
638
643
|
# 整数型の場合は浮動小数型へ変換
|
639
|
-
ary0 = self.integer? ? self.to_type(
|
644
|
+
ary0 = self.integer? ? self.to_type(@array.class.const_get(:DFLOAT)) : self
|
640
645
|
NArrayMiss.reduction(@mask, rank, min_count, dims, true, typecode) do |count_sum, count_accum|
|
641
646
|
ary0 = ary0.abs if ary0.complex?
|
642
647
|
ary0 = (ary0**2).sum(*dims) / count_sum
|
@@ -646,7 +651,7 @@ go back to ((<Index>))
|
|
646
651
|
def rmsdev(*dims)
|
647
652
|
min_count = NArrayMiss.check_options(dims, 1)
|
648
653
|
# 整数型の場合は浮動小数型へ変換
|
649
|
-
ary0 = self.integer? ? self.to_type(
|
654
|
+
ary0 = self.integer? ? self.to_type(@array.class.const_get(:DFLOAT)) : self
|
650
655
|
NArrayMiss.reduction(@mask, rank, min_count, dims, true, typecode) do |count_sum, count_accum|
|
651
656
|
ary0 = ary0 - ary0.accum(*dims)/count_accum
|
652
657
|
ary0 = ary0.abs if ary0.complex?
|
@@ -659,17 +664,17 @@ go back to ((<Index>))
|
|
659
664
|
if arg.length==0 then
|
660
665
|
return @array[@mask].median
|
661
666
|
else
|
662
|
-
nshape =
|
667
|
+
nshape = @array.class.to_na(@array.shape)
|
663
668
|
nshape[arg]=1
|
664
669
|
nslice = nshape[nshape.ne(1).where]
|
665
|
-
index =
|
670
|
+
index = @array.class.object(@mask.rank)
|
666
671
|
index[nshape.eq(1).where] = true
|
667
672
|
obj = NArrayMiss.new(@array.typecode,*nslice.to_a)
|
668
673
|
total = 1
|
669
674
|
nslice.each{|n| total *= n}
|
670
675
|
for i in 0...total
|
671
676
|
index[nshape.ne(1).where] = pos(i,nslice)
|
672
|
-
mask =
|
677
|
+
mask = @array.class.byte(*@array.shape).fill(0)
|
673
678
|
mask[*index] = 1
|
674
679
|
mask = @mask&mask
|
675
680
|
if mask.count_true != 0 then
|
@@ -697,17 +702,17 @@ go back to ((<Index>))
|
|
697
702
|
obj[@mask] = @array[@mask].#{operator}
|
698
703
|
return obj
|
699
704
|
else
|
700
|
-
nshape =
|
705
|
+
nshape = @array.class.to_na(@array.shape)
|
701
706
|
nshape[arg]=1
|
702
707
|
nslice = nshape[nshape.ne(1).where]
|
703
|
-
index =
|
708
|
+
index = @array.class.object(@mask.rank)
|
704
709
|
index[nshape.eq(1).where] = true
|
705
710
|
obj = NArrayMiss.new(@array.typecode,*@array.shape)
|
706
711
|
total = 1
|
707
712
|
nslice.each{|n| total *= n}
|
708
713
|
for i in 0...total
|
709
714
|
index[nshape.ne(1).where] = pos(i,nslice)
|
710
|
-
mask =
|
715
|
+
mask = @array.class.byte(*@array.shape).fill(0)
|
711
716
|
mask[*index] = 1
|
712
717
|
mask = @mask&mask
|
713
718
|
if mask.count_true != 0 then
|
@@ -1077,14 +1082,14 @@ go back to ((<Index>))
|
|
1077
1082
|
end
|
1078
1083
|
def set_mask(mask)
|
1079
1084
|
if mask.class == Array then
|
1080
|
-
tmp =
|
1085
|
+
tmp = @array.class.byte(*@mask.shape)
|
1081
1086
|
tmp[true] = mask
|
1082
1087
|
mask = tmp
|
1083
1088
|
end
|
1084
1089
|
if mask.class == NArrayMiss then
|
1085
1090
|
mask = mask.to_na(0)
|
1086
1091
|
end
|
1087
|
-
if mask.class ==
|
1092
|
+
if mask.class == @array.class then
|
1088
1093
|
if mask.typecode != BYTE then
|
1089
1094
|
raise("mask must be NArrayMiss.byte, NArray.byte or Array")
|
1090
1095
|
end
|
@@ -1160,7 +1165,7 @@ go back to ((<Index>))
|
|
1160
1165
|
if arg.length==0 then
|
1161
1166
|
return @mask.count_false
|
1162
1167
|
else
|
1163
|
-
return
|
1168
|
+
return @array.class.int(*@mask.shape).fill(1).sum(*arg)-
|
1164
1169
|
@mask.to_type(MINT).sum(*arg)
|
1165
1170
|
end
|
1166
1171
|
end
|
@@ -1201,8 +1206,8 @@ go back to ((<Index>))
|
|
1201
1206
|
|
1202
1207
|
def coerce(x)
|
1203
1208
|
if Numeric===x then
|
1204
|
-
return [NArrayMiss.new(
|
1205
|
-
elsif x.class==Array || x.class
|
1209
|
+
return [NArrayMiss.new(@array.class[x].typecode,*self.shape).fill(x),self]
|
1210
|
+
elsif x.class==Array || x.class==@array.class then
|
1206
1211
|
return [NArrayMiss.to_nam(x), self]
|
1207
1212
|
else
|
1208
1213
|
raise("donnot know how to cange #{x.class} to NArrayMiss")
|
@@ -1217,7 +1222,7 @@ go back to ((<Index>))
|
|
1217
1222
|
max_col = 80
|
1218
1223
|
sep = ", "
|
1219
1224
|
const = Hash.new
|
1220
|
-
|
1225
|
+
@array.class.constants.each{|c| const[@array.class.const_get(c)] = c}
|
1221
1226
|
str_ret = "NArrayMiss."+const[typecode].to_s.downcase+"("+shape.join(",")+"):"
|
1222
1227
|
if rank == 0 then
|
1223
1228
|
str_ret << " []"
|
@@ -1291,7 +1296,7 @@ go back to ((<Index>))
|
|
1291
1296
|
private
|
1292
1297
|
def pos(n,shape)
|
1293
1298
|
rank = shape.length
|
1294
|
-
result =
|
1299
|
+
result = @array.class.int(rank)
|
1295
1300
|
m=n
|
1296
1301
|
for i in 0..rank-2
|
1297
1302
|
j = rank-1-i
|
@@ -1310,11 +1315,11 @@ go back to ((<Index>))
|
|
1310
1315
|
term1 = @array
|
1311
1316
|
term2 = arg
|
1312
1317
|
mask = @mask
|
1313
|
-
when Array,
|
1318
|
+
when Array, @array.class
|
1314
1319
|
term1 = @array.dup
|
1315
1320
|
term1[@mask.not] = dummy # 欠損部分に dummy を代入
|
1316
|
-
term2 = arg.kind_of?(
|
1317
|
-
mask =
|
1321
|
+
term2 = arg.kind_of?(@array.class) ? arg : @array.class.to_na(arg) # Array -> NArray
|
1322
|
+
mask = @array.class.byte(*term2.shape).fill(1) # 2項目は欠損無し
|
1318
1323
|
mask = @mask & mask
|
1319
1324
|
when NArrayMiss
|
1320
1325
|
term1 = @array.dup
|
@@ -1337,12 +1342,13 @@ go back to ((<Index>))
|
|
1337
1342
|
def self.reduction(mask, rank, min_count, dims, flag, typecode)
|
1338
1343
|
# flag: リダクションを行う次元方向の有効な値の個数で、割り算を行うかどうかのフラグ
|
1339
1344
|
count_sum = mask.to_type(MINT).sum(*dims)
|
1345
|
+
klass = mask.class
|
1340
1346
|
# 返り値が配列か、スカラーかによって分岐
|
1341
|
-
if count_sum.kind_of?(
|
1347
|
+
if count_sum.kind_of?(klass)
|
1342
1348
|
mask = count_sum.ge(min_count)
|
1343
1349
|
# すべての要素が欠損値にならないかチェック
|
1344
1350
|
if mask.any?
|
1345
|
-
count_accum =
|
1351
|
+
count_accum = klass.ref(count_sum)
|
1346
1352
|
dims.collect{|d|d<0 ? d+rank : d}.sort.each do |d|
|
1347
1353
|
count_accum.newdim!(d)
|
1348
1354
|
end
|
@@ -1355,13 +1361,13 @@ go back to ((<Index>))
|
|
1355
1361
|
ary = NArrayMiss.to_nam_no_dup(ary, mask) unless flag
|
1356
1362
|
else
|
1357
1363
|
# すべての要素が欠損値の NArrayMiss を返す
|
1358
|
-
na =
|
1364
|
+
na = klass.new(typecode, *mask.shape)
|
1359
1365
|
ary = NArrayMiss.to_nam_no_dup(na, false)
|
1360
1366
|
end
|
1361
1367
|
else
|
1362
1368
|
# 有効な要素数があるかチェック
|
1363
1369
|
if count_sum >= min_count
|
1364
|
-
count_accum =
|
1370
|
+
count_accum = klass.int(*([1]*mask.rank)).fill!(count_sum)
|
1365
1371
|
ary = yield(count_sum, count_accum)
|
1366
1372
|
else
|
1367
1373
|
# 有効な要素数が足りない場合は nil を返す
|
data/lib/narray_miss/version.rb
CHANGED
data/narray_miss.gemspec
CHANGED
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: narray_miss
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Seiya Nishizawa
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-05-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: narray
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|