numo-narray 0.9.1.4 → 0.9.1.9

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.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +12 -6
  3. data/Rakefile +4 -63
  4. data/ext/numo/narray/array.c +35 -32
  5. data/ext/numo/narray/data.c +40 -43
  6. data/ext/numo/narray/depend.erb +6 -10
  7. data/ext/numo/narray/extconf.rb +24 -21
  8. data/ext/numo/narray/gen/cogen.rb +2 -2
  9. data/ext/numo/narray/gen/narray_def.rb +5 -1
  10. data/ext/numo/narray/gen/spec.rb +17 -7
  11. data/ext/numo/narray/gen/tmpl/accum.c +2 -2
  12. data/ext/numo/narray/gen/tmpl/accum_arg.c +88 -0
  13. data/ext/numo/narray/gen/tmpl/accum_binary.c +1 -1
  14. data/ext/numo/narray/gen/tmpl/accum_index.c +25 -14
  15. data/ext/numo/narray/gen/tmpl/alloc_func.c +4 -1
  16. data/ext/numo/narray/gen/tmpl/allocate.c +1 -0
  17. data/ext/numo/narray/gen/tmpl/aref.c +5 -35
  18. data/ext/numo/narray/gen/tmpl/aset.c +7 -37
  19. data/ext/numo/narray/gen/tmpl/bincount.c +7 -7
  20. data/ext/numo/narray/gen/tmpl/cast.c +7 -0
  21. data/ext/numo/narray/gen/tmpl/clip.c +11 -15
  22. data/ext/numo/narray/gen/tmpl/cum.c +1 -1
  23. data/ext/numo/narray/gen/tmpl/each.c +4 -2
  24. data/ext/numo/narray/gen/tmpl/each_with_index.c +5 -2
  25. data/ext/numo/narray/gen/tmpl/lib.c +2 -2
  26. data/ext/numo/narray/gen/tmpl/logseq.c +6 -5
  27. data/ext/numo/narray/gen/tmpl/map_with_index.c +5 -6
  28. data/ext/numo/narray/gen/tmpl/median.c +2 -2
  29. data/ext/numo/narray/gen/tmpl/minmax.c +1 -1
  30. data/ext/numo/narray/gen/tmpl/poly.c +4 -4
  31. data/ext/numo/narray/gen/tmpl/qsort.c +1 -1
  32. data/ext/numo/narray/gen/tmpl/rand.c +8 -6
  33. data/ext/numo/narray/gen/tmpl/rand_norm.c +18 -16
  34. data/ext/numo/narray/gen/tmpl/seq.c +5 -4
  35. data/ext/numo/narray/gen/tmpl/sort.c +3 -3
  36. data/ext/numo/narray/gen/tmpl/sort_index.c +2 -2
  37. data/ext/numo/narray/gen/tmpl/store_array.c +14 -2
  38. data/ext/numo/narray/gen/tmpl/unary_s.c +55 -31
  39. data/ext/numo/narray/gen/tmpl_bit/allocate.c +1 -0
  40. data/ext/numo/narray/gen/tmpl_bit/aref.c +22 -30
  41. data/ext/numo/narray/gen/tmpl_bit/aset.c +20 -34
  42. data/ext/numo/narray/gen/tmpl_bit/binary.c +48 -14
  43. data/ext/numo/narray/gen/tmpl_bit/bit_count.c +5 -0
  44. data/ext/numo/narray/gen/tmpl_bit/bit_reduce.c +5 -0
  45. data/ext/numo/narray/gen/tmpl_bit/store_array.c +14 -2
  46. data/ext/numo/narray/gen/tmpl_bit/store_bit.c +27 -9
  47. data/ext/numo/narray/gen/tmpl_bit/unary.c +25 -7
  48. data/ext/numo/narray/index.c +363 -59
  49. data/ext/numo/narray/math.c +2 -2
  50. data/ext/numo/narray/narray.c +151 -36
  51. data/ext/numo/narray/ndloop.c +4 -4
  52. data/ext/numo/narray/numo/intern.h +3 -2
  53. data/ext/numo/narray/numo/narray.h +37 -14
  54. data/ext/numo/narray/numo/ndloop.h +2 -2
  55. data/ext/numo/narray/numo/template.h +11 -15
  56. data/ext/numo/narray/numo/types/complex.h +2 -2
  57. data/ext/numo/narray/numo/types/int16.h +5 -2
  58. data/ext/numo/narray/numo/types/int32.h +0 -1
  59. data/ext/numo/narray/numo/types/int64.h +0 -1
  60. data/ext/numo/narray/numo/types/int8.h +1 -2
  61. data/ext/numo/narray/numo/types/uint16.h +5 -2
  62. data/ext/numo/narray/numo/types/uint32.h +0 -1
  63. data/ext/numo/narray/numo/types/uint64.h +0 -1
  64. data/ext/numo/narray/numo/types/uint8.h +1 -2
  65. data/ext/numo/narray/numo/types/xint_macro.h +2 -0
  66. data/ext/numo/narray/step.c +58 -252
  67. data/ext/numo/narray/struct.c +3 -3
  68. data/lib/numo/narray.rb +1 -7
  69. data/lib/numo/narray/extra.rb +214 -213
  70. data/numo-narray.gemspec +7 -8
  71. metadata +17 -36
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  strut.c
3
- Numerical Array Extension for Ruby
4
- (C) Copyright 1999-2017 by Masahiro TANAKA
3
+ Ruby/Numo::NArray - Numerical Array class for Ruby
4
+ Copyright (C) 1999-2020 Masahiro TANAKA
5
5
  */
6
6
  #include <ruby.h>
7
7
  #include "numo/narray.h"
@@ -813,7 +813,7 @@ nst_s_add_type(int argc, VALUE *argv, VALUE mod)
813
813
 
814
814
  #define NST_TYPEDEF(tpname,tpclass) \
815
815
  static VALUE \
816
- nst_s_##tpname(VALUE argc, VALUE *argv, VALUE mod) \
816
+ nst_s_##tpname(int argc, VALUE *argv, VALUE mod) \
817
817
  { nstruct_add_type(tpclass,argc,argv,mod); \
818
818
  return Qnil; \
819
819
  }
@@ -1,8 +1,2 @@
1
- begin
2
- major, minor, _ = RUBY_VERSION.split(/\./)
3
- require "#{major}.#{minor}/numo/narray.so"
4
- rescue LoadError
5
- require "numo/narray.so"
6
- end
7
-
1
+ require "numo/narray.so"
8
2
  require "numo/narray/extra"
@@ -43,75 +43,25 @@ module Numo
43
43
  reverse(0)
44
44
  end
45
45
 
46
- # Multi-dimensional array indexing.
47
- # Same as [] for one-dimensional NArray.
48
- # Similar to numpy's tuple indexing, i.e., `a[[1,2,..],[3,4,..]]`
49
- # (This method will be rewritten in C)
50
- # @return [Numo::NArray] one-dimensional view of self.
51
- # @example
52
- # p x = Numo::DFloat.new(3,3,3).seq
53
- # # Numo::DFloat#shape=[3,3,3]
54
- # # [[[0, 1, 2],
55
- # # [3, 4, 5],
56
- # # [6, 7, 8]],
57
- # # [[9, 10, 11],
58
- # # [12, 13, 14],
59
- # # [15, 16, 17]],
60
- # # [[18, 19, 20],
61
- # # [21, 22, 23],
62
- # # [24, 25, 26]]]
63
- #
64
- # p x.at([0,1,2],[0,1,2],[-1,-2,-3])
65
- # # Numo::DFloat(view)#shape=[3]
66
- # # [2, 13, 24]
67
- def at(*indices)
68
- if indices.size != ndim
69
- raise DimensionError, "argument length does not match dimension size"
70
- end
71
- idx = nil
72
- stride = 1
73
- (indices.size-1).downto(0) do |i|
74
- ix = Int64.cast(indices[i])
75
- if ix.ndim != 1
76
- raise DimensionError, "index array is not one-dimensional"
77
- end
78
- ix[ix < 0] += shape[i]
79
- if ((ix < 0) & (ix >= shape[i])).any?
80
- raise IndexError, "index array is out of range"
81
- end
82
- if idx
83
- if idx.size != ix.size
84
- raise ShapeError, "index array sizes mismatch"
85
- end
86
- idx += ix * stride
87
- stride *= shape[i]
88
- else
89
- idx = ix
90
- stride = shape[i]
91
- end
92
- end
93
- self[idx]
94
- end
95
-
96
46
  # Rotate in the plane specified by axes.
97
47
  # @example
98
- # p a = Numo::Int32.new(2,2).seq
99
- # # Numo::Int32#shape=[2,2]
48
+ # a = Numo::Int32.new(2,2).seq
49
+ # # => Numo::Int32#shape=[2,2]
100
50
  # # [[0, 1],
101
51
  # # [2, 3]]
102
52
  #
103
- # p a.rot90
104
- # # Numo::Int32(view)#shape=[2,2]
53
+ # a.rot90
54
+ # # => Numo::Int32(view)#shape=[2,2]
105
55
  # # [[1, 3],
106
56
  # # [0, 2]]
107
57
  #
108
- # p a.rot90(2)
109
- # # Numo::Int32(view)#shape=[2,2]
58
+ # a.rot90(2)
59
+ # # => Numo::Int32(view)#shape=[2,2]
110
60
  # # [[3, 2],
111
61
  # # [1, 0]]
112
62
  #
113
- # p a.rot90(3)
114
- # # Numo::Int32(view)#shape=[2,2]
63
+ # a.rot90(3)
64
+ # # => Numo::Int32(view)#shape=[2,2]
115
65
  # # [[2, 0],
116
66
  # # [3, 1]]
117
67
  def rot90(k=1,axes=[0,1])
@@ -156,7 +106,19 @@ module Numo
156
106
 
157
107
  # Convert the argument to an narray if not an narray.
158
108
  def self.cast(a)
159
- a.kind_of?(NArray) ? a : NArray.array_type(a).cast(a)
109
+ case a
110
+ when NArray
111
+ a
112
+ when Array,Numeric
113
+ NArray.array_type(a).cast(a)
114
+ else
115
+ if a.respond_to?(:to_a)
116
+ a = a.to_a
117
+ NArray.array_type(a).cast(a)
118
+ else
119
+ raise TypeError,"invalid type for NArray"
120
+ end
121
+ end
160
122
  end
161
123
 
162
124
  def self.asarray(a)
@@ -177,10 +139,10 @@ module Numo
177
139
  # 4 9 7
178
140
  # 2 -1 6
179
141
  # ]
180
- # => Numo::DFloat#shape=[3,3]
181
- # [[2, -3, 5],
182
- # [4, 9, 7],
183
- # [2, -1, 6]]
142
+ # # => Numo::DFloat#shape=[3,3]
143
+ # # [[2, -3, 5],
144
+ # # [4, 9, 7],
145
+ # # [2, -1, 6]]
184
146
 
185
147
  def self.parse(str, split1d:/\s+/, split2d:/;?$|;/,
186
148
  split3d:/\s*\n(\s*\n)+/m)
@@ -210,7 +172,7 @@ module Numo
210
172
 
211
173
 
212
174
  # Iterate over an axis
213
- # @ example
175
+ # @example
214
176
  # > a = Numo::DFloat.new(2,2,2).seq
215
177
  # > p a
216
178
  # Numo::DFloat#shape=[2,2,2]
@@ -260,19 +222,19 @@ module Numo
260
222
  # Append values to the end of an narray.
261
223
  # @example
262
224
  # a = Numo::DFloat[1, 2, 3]
263
- # p a.append([[4, 5, 6], [7, 8, 9]])
264
- # # Numo::DFloat#shape=[9]
225
+ # a.append([[4, 5, 6], [7, 8, 9]])
226
+ # # => Numo::DFloat#shape=[9]
265
227
  # # [1, 2, 3, 4, 5, 6, 7, 8, 9]
266
228
  #
267
229
  # a = Numo::DFloat[[1, 2, 3]]
268
- # p a.append([[4, 5, 6], [7, 8, 9]],axis:0)
269
- # # Numo::DFloat#shape=[3,3]
230
+ # a.append([[4, 5, 6], [7, 8, 9]],axis:0)
231
+ # # => Numo::DFloat#shape=[3,3]
270
232
  # # [[1, 2, 3],
271
233
  # # [4, 5, 6],
272
234
  # # [7, 8, 9]]
273
235
  #
274
236
  # a = Numo::DFloat[[1, 2, 3], [4, 5, 6]]
275
- # p a.append([7, 8, 9], axis:0)
237
+ # a.append([7, 8, 9], axis:0)
276
238
  # # in `append': dimension mismatch (Numo::NArray::DimensionError)
277
239
 
278
240
  def append(other,axis:nil)
@@ -295,19 +257,19 @@ module Numo
295
257
 
296
258
  # @example
297
259
  # a = Numo::DFloat[[1,2,3,4], [5,6,7,8], [9,10,11,12]]
298
- # p a.delete(1,0)
299
- # # Numo::DFloat(view)#shape=[2,4]
260
+ # a.delete(1,0)
261
+ # # => Numo::DFloat(view)#shape=[2,4]
300
262
  # # [[1, 2, 3, 4],
301
263
  # # [9, 10, 11, 12]]
302
264
  #
303
- # p a.delete((0..-1).step(2),1)
304
- # # Numo::DFloat(view)#shape=[3,2]
265
+ # a.delete((0..-1).step(2),1)
266
+ # # => Numo::DFloat(view)#shape=[3,2]
305
267
  # # [[2, 4],
306
268
  # # [6, 8],
307
269
  # # [10, 12]]
308
270
  #
309
- # p a.delete([1,3,5])
310
- # # Numo::DFloat(view)#shape=[9]
271
+ # a.delete([1,3,5])
272
+ # # => Numo::DFloat(view)#shape=[9]
311
273
  # # [1, 3, 5, 7, 8, 9, 10, 11, 12]
312
274
 
313
275
  def delete(indice,axis=nil)
@@ -326,72 +288,72 @@ module Numo
326
288
 
327
289
  # Insert values along the axis before the indices.
328
290
  # @example
329
- # p a = Numo::DFloat[[1, 2], [3, 4]]
291
+ # a = Numo::DFloat[[1, 2], [3, 4]]
330
292
  # a = Numo::Int32[[1, 1], [2, 2], [3, 3]]
331
293
  #
332
- # p a.insert(1,5)
333
- # # Numo::Int32#shape=[7]
294
+ # a.insert(1,5)
295
+ # # => Numo::Int32#shape=[7]
334
296
  # # [1, 5, 1, 2, 2, 3, 3]
335
297
  #
336
- # p a.insert(1, 5, axis:1)
337
- # # Numo::Int32#shape=[3,3]
298
+ # a.insert(1, 5, axis:1)
299
+ # # => Numo::Int32#shape=[3,3]
338
300
  # # [[1, 5, 1],
339
301
  # # [2, 5, 2],
340
302
  # # [3, 5, 3]]
341
303
  #
342
- # p a.insert([1], [[11],[12],[13]], axis:1)
343
- # # Numo::Int32#shape=[3,3]
304
+ # a.insert([1], [[11],[12],[13]], axis:1)
305
+ # # => Numo::Int32#shape=[3,3]
344
306
  # # [[1, 11, 1],
345
307
  # # [2, 12, 2],
346
308
  # # [3, 13, 3]]
347
309
  #
348
- # p a.insert(1, [11, 12, 13], axis:1)
349
- # # Numo::Int32#shape=[3,3]
310
+ # a.insert(1, [11, 12, 13], axis:1)
311
+ # # => Numo::Int32#shape=[3,3]
350
312
  # # [[1, 11, 1],
351
313
  # # [2, 12, 2],
352
314
  # # [3, 13, 3]]
353
315
  #
354
- # p a.insert([1], [11, 12, 13], axis:1)
355
- # # Numo::Int32#shape=[3,5]
316
+ # a.insert([1], [11, 12, 13], axis:1)
317
+ # # => Numo::Int32#shape=[3,5]
356
318
  # # [[1, 11, 12, 13, 1],
357
319
  # # [2, 11, 12, 13, 2],
358
320
  # # [3, 11, 12, 13, 3]]
359
321
  #
360
- # p b = a.flatten
361
- # # Numo::Int32(view)#shape=[6]
322
+ # b = a.flatten
323
+ # # => Numo::Int32(view)#shape=[6]
362
324
  # # [1, 1, 2, 2, 3, 3]
363
325
  #
364
- # p b.insert(2,[15,16])
365
- # # Numo::Int32#shape=[8]
326
+ # b.insert(2,[15,16])
327
+ # # => Numo::Int32#shape=[8]
366
328
  # # [1, 1, 15, 16, 2, 2, 3, 3]
367
329
  #
368
- # p b.insert([2,2],[15,16])
369
- # # Numo::Int32#shape=[8]
330
+ # b.insert([2,2],[15,16])
331
+ # # => Numo::Int32#shape=[8]
370
332
  # # [1, 1, 15, 16, 2, 2, 3, 3]
371
333
  #
372
- # p b.insert([2,1],[15,16])
373
- # # Numo::Int32#shape=[8]
334
+ # b.insert([2,1],[15,16])
335
+ # # => Numo::Int32#shape=[8]
374
336
  # # [1, 16, 1, 15, 2, 2, 3, 3]
375
337
  #
376
- # p b.insert([2,0,1],[15,16,17])
377
- # # Numo::Int32#shape=[9]
338
+ # b.insert([2,0,1],[15,16,17])
339
+ # # => Numo::Int32#shape=[9]
378
340
  # # [16, 1, 17, 1, 15, 2, 2, 3, 3]
379
341
  #
380
- # p b.insert(2..3, [15, 16])
381
- # # Numo::Int32#shape=[8]
342
+ # b.insert(2..3, [15, 16])
343
+ # # => Numo::Int32#shape=[8]
382
344
  # # [1, 1, 15, 2, 16, 2, 3, 3]
383
345
  #
384
- # p b.insert(2, [7.13, 0.5])
385
- # # Numo::Int32#shape=[8]
346
+ # b.insert(2, [7.13, 0.5])
347
+ # # => Numo::Int32#shape=[8]
386
348
  # # [1, 1, 7, 0, 2, 2, 3, 3]
387
349
  #
388
- # p x = Numo::DFloat.new(2,4).seq
389
- # # Numo::DFloat#shape=[2,4]
350
+ # x = Numo::DFloat.new(2,4).seq
351
+ # # => Numo::DFloat#shape=[2,4]
390
352
  # # [[0, 1, 2, 3],
391
353
  # # [4, 5, 6, 7]]
392
354
  #
393
- # p x.insert([1,3],999,axis:1)
394
- # # Numo::DFloat#shape=[2,6]
355
+ # x.insert([1,3],999,axis:1)
356
+ # # => Numo::DFloat#shape=[2,6]
395
357
  # # [[0, 999, 1, 2, 999, 3],
396
358
  # # [4, 999, 5, 6, 999, 7]]
397
359
 
@@ -441,23 +403,23 @@ module Numo
441
403
 
442
404
  class << self
443
405
  # @example
444
- # p a = Numo::DFloat[[1, 2], [3, 4]]
445
- # # Numo::DFloat#shape=[2,2]
406
+ # a = Numo::DFloat[[1, 2], [3, 4]]
407
+ # # => Numo::DFloat#shape=[2,2]
446
408
  # # [[1, 2],
447
409
  # # [3, 4]]
448
410
  #
449
- # p b = Numo::DFloat[[5, 6]]
450
- # # Numo::DFloat#shape=[1,2]
411
+ # b = Numo::DFloat[[5, 6]]
412
+ # # => Numo::DFloat#shape=[1,2]
451
413
  # # [[5, 6]]
452
414
  #
453
- # p Numo::NArray.concatenate([a,b],axis:0)
454
- # # Numo::DFloat#shape=[3,2]
415
+ # Numo::NArray.concatenate([a,b],axis:0)
416
+ # # => Numo::DFloat#shape=[3,2]
455
417
  # # [[1, 2],
456
418
  # # [3, 4],
457
419
  # # [5, 6]]
458
420
  #
459
- # p Numo::NArray.concatenate([a,b.transpose], axis:1)
460
- # # Numo::DFloat#shape=[2,3]
421
+ # Numo::NArray.concatenate([a,b.transpose], axis:1)
422
+ # # => Numo::DFloat#shape=[2,3]
461
423
  # # [[1, 2, 5],
462
424
  # # [3, 4, 6]]
463
425
 
@@ -509,8 +471,10 @@ module Numo
509
471
  arrays.each do |a|
510
472
  fst = lst
511
473
  lst = fst + (a.shape[axis-nd]||1)
512
- refs[axis] = fst...lst
513
- result[*refs] = a
474
+ if lst > fst
475
+ refs[axis] = fst...lst
476
+ result[*refs] = a
477
+ end
514
478
  end
515
479
  result
516
480
  end
@@ -519,15 +483,15 @@ module Numo
519
483
  # @example
520
484
  # a = Numo::Int32[1,2,3]
521
485
  # b = Numo::Int32[2,3,4]
522
- # p Numo::NArray.vstack([a,b])
523
- # # Numo::Int32#shape=[2,3]
486
+ # Numo::NArray.vstack([a,b])
487
+ # # => Numo::Int32#shape=[2,3]
524
488
  # # [[1, 2, 3],
525
489
  # # [2, 3, 4]]
526
490
  #
527
491
  # a = Numo::Int32[[1],[2],[3]]
528
492
  # b = Numo::Int32[[2],[3],[4]]
529
- # p Numo::NArray.vstack([a,b])
530
- # # Numo::Int32#shape=[6,1]
493
+ # Numo::NArray.vstack([a,b])
494
+ # # => Numo::Int32#shape=[6,1]
531
495
  # # [[1],
532
496
  # # [2],
533
497
  # # [3],
@@ -546,14 +510,14 @@ module Numo
546
510
  # @example
547
511
  # a = Numo::Int32[1,2,3]
548
512
  # b = Numo::Int32[2,3,4]
549
- # p Numo::NArray.hstack([a,b])
550
- # # Numo::Int32#shape=[6]
513
+ # Numo::NArray.hstack([a,b])
514
+ # # => Numo::Int32#shape=[6]
551
515
  # # [1, 2, 3, 2, 3, 4]
552
516
  #
553
517
  # a = Numo::Int32[[1],[2],[3]]
554
518
  # b = Numo::Int32[[2],[3],[4]]
555
- # p Numo::NArray.hstack([a,b])
556
- # # Numo::Int32#shape=[3,2]
519
+ # Numo::NArray.hstack([a,b])
520
+ # # => Numo::Int32#shape=[3,2]
557
521
  # # [[1, 2],
558
522
  # # [2, 3],
559
523
  # # [3, 4]]
@@ -574,16 +538,16 @@ module Numo
574
538
  # @example
575
539
  # a = Numo::Int32[1,2,3]
576
540
  # b = Numo::Int32[2,3,4]
577
- # p Numo::NArray.dstack([a,b])
578
- # # Numo::Int32#shape=[1,3,2]
541
+ # Numo::NArray.dstack([a,b])
542
+ # # => Numo::Int32#shape=[1,3,2]
579
543
  # # [[[1, 2],
580
544
  # # [2, 3],
581
545
  # # [3, 4]]]
582
546
  #
583
547
  # a = Numo::Int32[[1],[2],[3]]
584
548
  # b = Numo::Int32[[2],[3],[4]]
585
- # p Numo::NArray.dstack([a,b])
586
- # # Numo::Int32#shape=[3,1,2]
549
+ # Numo::NArray.dstack([a,b])
550
+ # # => Numo::Int32#shape=[3,1,2]
587
551
  # # [[[1, 2]],
588
552
  # # [[2, 3]],
589
553
  # # [[3, 4]]]
@@ -599,8 +563,8 @@ module Numo
599
563
  # @example
600
564
  # x = Numo::Int32[1,2,3]
601
565
  # y = Numo::Int32[2,3,4]
602
- # p Numo::NArray.column_stack([x,y])
603
- # # Numo::Int32#shape=[3,2]
566
+ # Numo::NArray.column_stack([x,y])
567
+ # # => Numo::Int32#shape=[3,2]
604
568
  # # [[1, 2],
605
569
  # # [2, 3],
606
570
  # # [3, 4]]
@@ -640,23 +604,23 @@ module Numo
640
604
  end # class << self
641
605
 
642
606
  # @example
643
- # p a = Numo::DFloat[[1, 2], [3, 4]]
644
- # # Numo::DFloat#shape=[2,2]
607
+ # a = Numo::DFloat[[1, 2], [3, 4]]
608
+ # # => Numo::DFloat#shape=[2,2]
645
609
  # # [[1, 2],
646
610
  # # [3, 4]]
647
611
  #
648
- # p b = Numo::DFloat[[5, 6]]
649
- # # Numo::DFloat#shape=[1,2]
612
+ # b = Numo::DFloat[[5, 6]]
613
+ # # => Numo::DFloat#shape=[1,2]
650
614
  # # [[5, 6]]
651
615
  #
652
- # p a.concatenate(b,axis:0)
653
- # # Numo::DFloat#shape=[3,2]
616
+ # a.concatenate(b,axis:0)
617
+ # # => Numo::DFloat#shape=[3,2]
654
618
  # # [[1, 2],
655
619
  # # [3, 4],
656
620
  # # [5, 6]]
657
621
  #
658
- # p a.concatenate(b.transpose, axis:1)
659
- # # Numo::DFloat#shape=[2,3]
622
+ # a.concatenate(b.transpose, axis:1)
623
+ # # => Numo::DFloat#shape=[2,3]
660
624
  # # [[1, 2, 5],
661
625
  # # [3, 4, 6]]
662
626
 
@@ -690,36 +654,40 @@ module Numo
690
654
  result = self.class.zeros(*self_shape)
691
655
  lst = shape[axis]
692
656
  refs = [true] * ndim
693
- refs[axis] = 0...lst
694
- result[*refs] = self
657
+ if lst > 0
658
+ refs[axis] = 0...lst
659
+ result[*refs] = self
660
+ end
695
661
  arrays.each do |a|
696
662
  fst = lst
697
663
  lst = fst + (a.shape[axis-ndim] || 1)
698
- refs[axis] = fst...lst
699
- result[*refs] = a
664
+ if lst > fst
665
+ refs[axis] = fst...lst
666
+ result[*refs] = a
667
+ end
700
668
  end
701
669
  result
702
670
  end
703
671
 
704
672
  # @example
705
- # p x = Numo::DFloat.new(9).seq
706
- # # Numo::DFloat#shape=[9]
673
+ # x = Numo::DFloat.new(9).seq
674
+ # # => Numo::DFloat#shape=[9]
707
675
  # # [0, 1, 2, 3, 4, 5, 6, 7, 8]
708
676
  #
709
- # pp x.split(3)
710
- # # [Numo::DFloat(view)#shape=[3]
677
+ # x.split(3)
678
+ # # => [Numo::DFloat(view)#shape=[3]
711
679
  # # [0, 1, 2],
712
680
  # # Numo::DFloat(view)#shape=[3]
713
681
  # # [3, 4, 5],
714
682
  # # Numo::DFloat(view)#shape=[3]
715
683
  # # [6, 7, 8]]
716
684
  #
717
- # p x = Numo::DFloat.new(8).seq
718
- # # Numo::DFloat#shape=[8]
685
+ # x = Numo::DFloat.new(8).seq
686
+ # # => Numo::DFloat#shape=[8]
719
687
  # # [0, 1, 2, 3, 4, 5, 6, 7]
720
688
  #
721
- # pp x.split([3, 5, 6, 10])
722
- # # [Numo::DFloat(view)#shape=[3]
689
+ # x.split([3, 5, 6, 10])
690
+ # # => [Numo::DFloat(view)#shape=[3]
723
691
  # # [0, 1, 2],
724
692
  # # Numo::DFloat(view)#shape=[2]
725
693
  # # [3, 4],
@@ -766,15 +734,15 @@ module Numo
766
734
  end
767
735
 
768
736
  # @example
769
- # p x = Numo::DFloat.new(4,4).seq
770
- # # Numo::DFloat#shape=[4,4]
737
+ # x = Numo::DFloat.new(4,4).seq
738
+ # # => Numo::DFloat#shape=[4,4]
771
739
  # # [[0, 1, 2, 3],
772
740
  # # [4, 5, 6, 7],
773
741
  # # [8, 9, 10, 11],
774
742
  # # [12, 13, 14, 15]]
775
743
  #
776
- # pp x.hsplit(2)
777
- # # [Numo::DFloat(view)#shape=[4,2]
744
+ # x.hsplit(2)
745
+ # # => [Numo::DFloat(view)#shape=[4,2]
778
746
  # # [[0, 1],
779
747
  # # [4, 5],
780
748
  # # [8, 9],
@@ -785,8 +753,8 @@ module Numo
785
753
  # # [10, 11],
786
754
  # # [14, 15]]]
787
755
  #
788
- # pp x.hsplit([3, 6])
789
- # # [Numo::DFloat(view)#shape=[4,3]
756
+ # x.hsplit([3, 6])
757
+ # # => [Numo::DFloat(view)#shape=[4,3]
790
758
  # # [[0, 1, 2],
791
759
  # # [4, 5, 6],
792
760
  # # [8, 9, 10],
@@ -811,47 +779,47 @@ module Numo
811
779
  end
812
780
 
813
781
  # @example
814
- # p a = Numo::NArray[0,1,2]
815
- # # Numo::Int32#shape=[3]
782
+ # a = Numo::NArray[0,1,2]
783
+ # # => Numo::Int32#shape=[3]
816
784
  # # [0, 1, 2]
817
785
  #
818
- # p a.tile(2)
819
- # # Numo::Int32#shape=[6]
786
+ # a.tile(2)
787
+ # # => Numo::Int32#shape=[6]
820
788
  # # [0, 1, 2, 0, 1, 2]
821
789
  #
822
- # p a.tile(2,2)
823
- # # Numo::Int32#shape=[2,6]
790
+ # a.tile(2,2)
791
+ # # => Numo::Int32#shape=[2,6]
824
792
  # # [[0, 1, 2, 0, 1, 2],
825
793
  # # [0, 1, 2, 0, 1, 2]]
826
794
  #
827
- # p a.tile(2,1,2)
828
- # # Numo::Int32#shape=[2,1,6]
795
+ # a.tile(2,1,2)
796
+ # # => Numo::Int32#shape=[2,1,6]
829
797
  # # [[[0, 1, 2, 0, 1, 2]],
830
798
  # # [[0, 1, 2, 0, 1, 2]]]
831
799
  #
832
- # p b = Numo::NArray[[1, 2], [3, 4]]
833
- # # Numo::Int32#shape=[2,2]
800
+ # b = Numo::NArray[[1, 2], [3, 4]]
801
+ # # => Numo::Int32#shape=[2,2]
834
802
  # # [[1, 2],
835
803
  # # [3, 4]]
836
804
  #
837
- # p b.tile(2)
838
- # # Numo::Int32#shape=[2,4]
805
+ # b.tile(2)
806
+ # # => Numo::Int32#shape=[2,4]
839
807
  # # [[1, 2, 1, 2],
840
808
  # # [3, 4, 3, 4]]
841
809
  #
842
- # p b.tile(2,1)
843
- # # Numo::Int32#shape=[4,2]
810
+ # b.tile(2,1)
811
+ # # => Numo::Int32#shape=[4,2]
844
812
  # # [[1, 2],
845
813
  # # [3, 4],
846
814
  # # [1, 2],
847
815
  # # [3, 4]]
848
816
  #
849
- # p c = Numo::NArray[1,2,3,4]
850
- # # Numo::Int32#shape=[4]
817
+ # c = Numo::NArray[1,2,3,4]
818
+ # # => Numo::Int32#shape=[4]
851
819
  # # [1, 2, 3, 4]
852
820
  #
853
- # p c.tile(4,1)
854
- # # Numo::Int32#shape=[4,4]
821
+ # c.tile(4,1)
822
+ # # => Numo::Int32#shape=[4,4]
855
823
  # # [[1, 2, 3, 4],
856
824
  # # [1, 2, 3, 4],
857
825
  # # [1, 2, 3, 4],
@@ -894,26 +862,26 @@ module Numo
894
862
  end
895
863
 
896
864
  # @example
897
- # p Numo::NArray[3].repeat(4)
898
- # # Numo::Int32#shape=[4]
865
+ # Numo::NArray[3].repeat(4)
866
+ # # => Numo::Int32#shape=[4]
899
867
  # # [3, 3, 3, 3]
900
868
  #
901
- # p x = Numo::NArray[[1,2],[3,4]]
902
- # # Numo::Int32#shape=[2,2]
869
+ # x = Numo::NArray[[1,2],[3,4]]
870
+ # # => Numo::Int32#shape=[2,2]
903
871
  # # [[1, 2],
904
872
  # # [3, 4]]
905
873
  #
906
- # p x.repeat(2)
907
- # # Numo::Int32#shape=[8]
874
+ # x.repeat(2)
875
+ # # => Numo::Int32#shape=[8]
908
876
  # # [1, 1, 2, 2, 3, 3, 4, 4]
909
877
  #
910
- # p x.repeat(3,axis:1)
911
- # # Numo::Int32#shape=[2,6]
878
+ # x.repeat(3,axis:1)
879
+ # # => Numo::Int32#shape=[2,6]
912
880
  # # [[1, 1, 1, 2, 2, 2],
913
881
  # # [3, 3, 3, 4, 4, 4]]
914
882
  #
915
- # p x.repeat([1,2],axis:0)
916
- # # Numo::Int32#shape=[3,2]
883
+ # x.repeat([1,2],axis:0)
884
+ # # => Numo::Int32#shape=[3,2]
917
885
  # # [[1, 2],
918
886
  # # [3, 4],
919
887
  # # [3, 4]]
@@ -954,30 +922,30 @@ module Numo
954
922
 
955
923
  # Calculate the n-th discrete difference along given axis.
956
924
  # @example
957
- # p x = Numo::DFloat[1, 2, 4, 7, 0]
958
- # # Numo::DFloat#shape=[5]
925
+ # x = Numo::DFloat[1, 2, 4, 7, 0]
926
+ # # => Numo::DFloat#shape=[5]
959
927
  # # [1, 2, 4, 7, 0]
960
928
  #
961
- # p x.diff
962
- # # Numo::DFloat#shape=[4]
929
+ # x.diff
930
+ # # => Numo::DFloat#shape=[4]
963
931
  # # [1, 2, 3, -7]
964
932
  #
965
- # p x.diff(2)
966
- # # Numo::DFloat#shape=[3]
933
+ # x.diff(2)
934
+ # # => Numo::DFloat#shape=[3]
967
935
  # # [1, 1, -10]
968
936
  #
969
- # p x = Numo::DFloat[[1, 3, 6, 10], [0, 5, 6, 8]]
970
- # # Numo::DFloat#shape=[2,4]
937
+ # x = Numo::DFloat[[1, 3, 6, 10], [0, 5, 6, 8]]
938
+ # # => Numo::DFloat#shape=[2,4]
971
939
  # # [[1, 3, 6, 10],
972
940
  # # [0, 5, 6, 8]]
973
941
  #
974
- # p x.diff
975
- # # Numo::DFloat#shape=[2,3]
942
+ # x.diff
943
+ # # => Numo::DFloat#shape=[2,3]
976
944
  # # [[2, 3, 4],
977
945
  # # [5, 1, 2]]
978
946
  #
979
- # p x.diff(axis:0)
980
- # # Numo::DFloat#shape=[1,4]
947
+ # x.diff(axis:0)
948
+ # # => Numo::DFloat#shape=[1,4]
981
949
  # # [[-1, 2, 0, -2]]
982
950
 
983
951
  def diff(n=1,axis:-1)
@@ -1182,18 +1150,20 @@ module Numo
1182
1150
  # @return [Numo::NArray] return outer product
1183
1151
  # @example
1184
1152
  # a = Numo::DFloat.ones(5)
1185
- # => Numo::DFloat#shape=[5]
1186
- # [1, 1, 1, 1, 1]
1153
+ # # => Numo::DFloat#shape=[5]
1154
+ # # [1, 1, 1, 1, 1]
1155
+ #
1187
1156
  # b = Numo::DFloat.linspace(-2,2,5)
1188
- # => Numo::DFloat#shape=[5]
1189
- # [-2, -1, 0, 1, 2]
1157
+ # # => Numo::DFloat#shape=[5]
1158
+ # # [-2, -1, 0, 1, 2]
1159
+ #
1190
1160
  # a.outer(b)
1191
- # => Numo::DFloat#shape=[5,5]
1192
- # [[-2, -1, 0, 1, 2],
1193
- # [-2, -1, 0, 1, 2],
1194
- # [-2, -1, 0, 1, 2],
1195
- # [-2, -1, 0, 1, 2],
1196
- # [-2, -1, 0, 1, 2]]
1161
+ # # => Numo::DFloat#shape=[5,5]
1162
+ # # [[-2, -1, 0, 1, 2],
1163
+ # # [-2, -1, 0, 1, 2],
1164
+ # # [-2, -1, 0, 1, 2],
1165
+ # # [-2, -1, 0, 1, 2],
1166
+ # # [-2, -1, 0, 1, 2]]
1197
1167
 
1198
1168
  def outer(b, axis:nil)
1199
1169
  b = NArray.cast(b)
@@ -1213,6 +1183,35 @@ module Numo
1213
1183
  end
1214
1184
  end
1215
1185
 
1186
+ # Percentile
1187
+ #
1188
+ # @param q [Numo::NArray]
1189
+ # @param axis [Integer] applied axis
1190
+ # @return [Numo::NArray] return percentile
1191
+ def percentile(q, axis: nil)
1192
+ raise ArgumentError, "q is out of range" if q < 0 || q > 100
1193
+
1194
+ x = self
1195
+ unless axis
1196
+ axis = 0
1197
+ x = x.flatten
1198
+ end
1199
+
1200
+ sorted = x.sort(axis: axis)
1201
+ x = q / 100.0 * (sorted.shape[axis] - 1)
1202
+ r = x % 1
1203
+ i = x.floor
1204
+ refs = [true] * sorted.ndim
1205
+ refs[axis] = i
1206
+ if i == sorted.shape[axis] - 1
1207
+ sorted[*refs]
1208
+ else
1209
+ refs_upper = refs.dup
1210
+ refs_upper[axis] = i + 1
1211
+ sorted[*refs] + r * (sorted[*refs_upper] - sorted[*refs])
1212
+ end
1213
+ end
1214
+
1216
1215
  # Kronecker product of two arrays.
1217
1216
  #
1218
1217
  # kron(a,b)[k_0, k_1, ...] = a[i_0, i_1, ...] * b[j_0, j_1, ...]
@@ -1222,17 +1221,19 @@ module Numo
1222
1221
  # @return [Numo::NArray] return Kronecker product
1223
1222
  # @example
1224
1223
  # Numo::DFloat[1,10,100].kron([5,6,7])
1225
- # => Numo::DFloat#shape=[9]
1226
- # [5, 6, 7, 50, 60, 70, 500, 600, 700]
1224
+ # # => Numo::DFloat#shape=[9]
1225
+ # # [5, 6, 7, 50, 60, 70, 500, 600, 700]
1226
+ #
1227
1227
  # Numo::DFloat[5,6,7].kron([1,10,100])
1228
- # => Numo::DFloat#shape=[9]
1229
- # [5, 50, 500, 6, 60, 600, 7, 70, 700]
1228
+ # # => Numo::DFloat#shape=[9]
1229
+ # # [5, 50, 500, 6, 60, 600, 7, 70, 700]
1230
+ #
1230
1231
  # Numo::DFloat.eye(2).kron(Numo::DFloat.ones(2,2))
1231
- # => Numo::DFloat#shape=[4,4]
1232
- # [[1, 1, 0, 0],
1233
- # [1, 1, 0, 0],
1234
- # [0, 0, 1, 1],
1235
- # [0, 0, 1, 1]]
1232
+ # # => Numo::DFloat#shape=[4,4]
1233
+ # # [[1, 1, 0, 0],
1234
+ # # [1, 1, 0, 0],
1235
+ # # [0, 0, 1, 1],
1236
+ # # [0, 0, 1, 1]]
1236
1237
 
1237
1238
  def kron(b)
1238
1239
  b = NArray.cast(b)