numo-narray 0.9.1.4 → 0.9.1.5

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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +10 -4
  3. data/ext/numo/narray/array.c +17 -7
  4. data/ext/numo/narray/data.c +39 -36
  5. data/ext/numo/narray/extconf.rb +1 -0
  6. data/ext/numo/narray/gen/narray_def.rb +4 -0
  7. data/ext/numo/narray/gen/spec.rb +5 -1
  8. data/ext/numo/narray/gen/tmpl/accum.c +2 -2
  9. data/ext/numo/narray/gen/tmpl/accum_arg.c +88 -0
  10. data/ext/numo/narray/gen/tmpl/accum_binary.c +1 -1
  11. data/ext/numo/narray/gen/tmpl/accum_index.c +25 -14
  12. data/ext/numo/narray/gen/tmpl/aref.c +5 -35
  13. data/ext/numo/narray/gen/tmpl/aset.c +7 -37
  14. data/ext/numo/narray/gen/tmpl/bincount.c +7 -7
  15. data/ext/numo/narray/gen/tmpl/clip.c +11 -15
  16. data/ext/numo/narray/gen/tmpl/cum.c +1 -1
  17. data/ext/numo/narray/gen/tmpl/each.c +4 -2
  18. data/ext/numo/narray/gen/tmpl/each_with_index.c +5 -2
  19. data/ext/numo/narray/gen/tmpl/lib.c +2 -2
  20. data/ext/numo/narray/gen/tmpl/logseq.c +6 -5
  21. data/ext/numo/narray/gen/tmpl/map_with_index.c +5 -6
  22. data/ext/numo/narray/gen/tmpl/median.c +2 -2
  23. data/ext/numo/narray/gen/tmpl/minmax.c +1 -1
  24. data/ext/numo/narray/gen/tmpl/poly.c +4 -4
  25. data/ext/numo/narray/gen/tmpl/qsort.c +1 -1
  26. data/ext/numo/narray/gen/tmpl/rand.c +8 -6
  27. data/ext/numo/narray/gen/tmpl/rand_norm.c +18 -16
  28. data/ext/numo/narray/gen/tmpl/seq.c +5 -4
  29. data/ext/numo/narray/gen/tmpl/sort.c +3 -3
  30. data/ext/numo/narray/gen/tmpl/sort_index.c +2 -2
  31. data/ext/numo/narray/gen/tmpl/store_array.c +14 -2
  32. data/ext/numo/narray/gen/tmpl/unary_s.c +55 -31
  33. data/ext/numo/narray/gen/tmpl_bit/aref.c +22 -30
  34. data/ext/numo/narray/gen/tmpl_bit/aset.c +20 -34
  35. data/ext/numo/narray/gen/tmpl_bit/binary.c +42 -14
  36. data/ext/numo/narray/gen/tmpl_bit/bit_count.c +5 -0
  37. data/ext/numo/narray/gen/tmpl_bit/bit_reduce.c +5 -0
  38. data/ext/numo/narray/gen/tmpl_bit/store_array.c +14 -2
  39. data/ext/numo/narray/gen/tmpl_bit/store_bit.c +21 -7
  40. data/ext/numo/narray/gen/tmpl_bit/unary.c +21 -7
  41. data/ext/numo/narray/index.c +369 -59
  42. data/ext/numo/narray/math.c +2 -2
  43. data/ext/numo/narray/narray.c +45 -27
  44. data/ext/numo/narray/ndloop.c +2 -2
  45. data/ext/numo/narray/numo/intern.h +3 -2
  46. data/ext/numo/narray/numo/narray.h +24 -5
  47. data/ext/numo/narray/numo/ndloop.h +2 -2
  48. data/ext/numo/narray/numo/template.h +4 -6
  49. data/ext/numo/narray/numo/types/complex.h +2 -2
  50. data/ext/numo/narray/step.c +58 -252
  51. data/ext/numo/narray/struct.c +2 -2
  52. data/lib/numo/narray/extra.rb +172 -212
  53. data/numo-narray.gemspec +9 -5
  54. metadata +18 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aba2ab60aae2fbf24973f75a9b17c9f35bd7fec15c58e110b6711a62773b2de0
4
- data.tar.gz: feae74cc5b9d5dfbe238f78f60b22f017a4558b241fe772b0615ac3fa0c80b68
3
+ metadata.gz: 2723cec3e04deedc561c54a0d4f6af799dd93fc8a32079d06a074f00f07f466c
4
+ data.tar.gz: 5548cfa23b0ac7227b62ab8edd00ba040805c0563befeb32591179dc090eff66
5
5
  SHA512:
6
- metadata.gz: f7af93ba0ac1b6732fa9bbe22f72572ecdd8c9142861c0a12ca9124eb2094fef512923ce6040a52576c835ebde4b9a697af973e68c97a9703430f92ad5d6442b
7
- data.tar.gz: b413079a3a924e698b074183d462397bd306bad255e619d1e58b52c623c175d93ca5ad72dbf17a84becc21172f10cc0cba4ea6c5d8c291cc706e20e0ff867d2e
6
+ metadata.gz: 19a91712b943da6f57f2cda4fa178adcb5a0c845c2b0ce8190f46c5c1a0d83a331fd32d71e9b2b85c960222f4a01940926bacba63eb882ea1b27aebb7a09c7a3
7
+ data.tar.gz: 4ee3a88369439ccf964fd23358a84530973c5355d4c71b35eda516bd655966ce127d494159c942bf0a82045b3f05a6be7ed16f4d9d30b96916df651c9a5ec0cb
data/README.md CHANGED
@@ -11,17 +11,17 @@ for fast processing and easy manipulation of multi-dimensional numerical data,
11
11
  similar to numpy.ndaray.
12
12
  This project is the successor to [Ruby/NArray](http://masa16.github.io/narray/).
13
13
 
14
- under development
15
-
16
14
  ## Documentation
15
+
17
16
  All documents are primitive.
18
17
 
19
- * [Numo::NArray API Doc](http://ruby-numo.github.io/narray/narray/frames.html)
18
+ * [Numo::NArray API Doc](http://ruby-numo.github.io/numo-narray/yard/index.html)
20
19
  * [Numo::NArray vs numpy](https://github.com/ruby-numo/numo-narray/wiki/Numo-vs-numpy)
21
20
  * [Numo::NArray vs ndarray](https://github.com/ruby-numo/numo-narray/wiki/Numo-vs-ndarray)
22
21
  * [Numo::NArray Overview](https://github.com/ruby-numo/numo-narray/wiki/Numo::NArray%E6%A6%82%E8%A6%81) (in Japanese)
23
22
 
24
23
  ## Related Projects
24
+
25
25
  * [Numo::Linalg](https://github.com/ruby-numo/numo-linalg) - Linear Algebra library with [LAPACK](http://www.netlib.org/lapack/).
26
26
  * [Numo::GSL](https://github.com/ruby-numo/numo-gsl) - Ruby interface for [GSL (GNU Scientific Library)](http://www.gnu.org/software/gsl/).
27
27
  * [Numo::FFTW](https://github.com/ruby-numo/numo-fftw) - Ruby/Numo interface to [FFTW (A Discrete Fourier Transform library](http://www.fftw.org/).
@@ -29,10 +29,13 @@ All documents are primitive.
29
29
  * [Numo::Gnuplot](https://github.com/ruby-numo/numo-gnuplot) - Simple and easy-to-use Gnuplot interface.
30
30
 
31
31
  ## Installation
32
+
32
33
  ### Requirement
33
- Ruby ver 2.1 and later.
34
+
35
+ Ruby ver 2.2 and later.
34
36
 
35
37
  ### Ubuntu, Debian, Bash on Windows
38
+
36
39
  ```shell
37
40
  apt install -y git ruby gcc ruby-dev rake make
38
41
  gem install specific_install
@@ -40,7 +43,9 @@ gem specific_install https://github.com/ruby-numo/numo-narray.git
40
43
  ```
41
44
 
42
45
  ## Quick start
46
+
43
47
  An example
48
+
44
49
  ```ruby
45
50
  [1] pry(main)> require "numo/narray"
46
51
  => true
@@ -58,6 +63,7 @@ An example
58
63
  [6] pry(main)> a.size
59
64
  => 15
60
65
  ```
66
+
61
67
  For more examples, check out this [narray version of 100 numpy exercises](https://github.com/ruby-numo/numo-narray/wiki/100-narray-exercises) (and the [IRuby Notebook](https://github.com/ruby-numo/numo-narray/blob/master/100-narray-exercises.ipynb)).
62
68
 
63
69
  ## Development
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  array.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-2019 Masahiro TANAKA
5
5
  */
6
6
  #include <ruby.h>
7
7
  #include "numo/narray.h"
@@ -122,10 +122,12 @@ static int na_mdai_object_type(int type, VALUE v)
122
122
  if (rb_obj_is_kind_of(v, rb_cRange)) {
123
123
  MDAI_ATTR_TYPE(type,v,begin);
124
124
  MDAI_ATTR_TYPE(type,v,end);
125
- } else if (rb_obj_is_kind_of(v, na_cStep)) {
125
+ #ifdef HAVE_RB_ARITHMETIC_SEQUENCE_EXTRACT
126
+ } else if (rb_obj_is_kind_of(v, rb_cArithSeq)) {
126
127
  MDAI_ATTR_TYPE(type,v,begin);
127
128
  MDAI_ATTR_TYPE(type,v,end);
128
129
  MDAI_ATTR_TYPE(type,v,step);
130
+ #endif
129
131
  } else {
130
132
  type = na_object_type(type,v);
131
133
  }
@@ -210,7 +212,13 @@ na_mdai_investigate(na_mdai_t *mdai, int ndim)
210
212
  }
211
213
  }
212
214
  else
213
- if (rb_obj_is_kind_of(v, rb_cRange) || rb_obj_is_kind_of(v, na_cStep)) {
215
+ if (rb_obj_is_kind_of(v, rb_cRange)
216
+ #ifdef HAVE_RB_ARITHMETIC_SEQUENCE_EXTRACT
217
+ || rb_obj_is_kind_of(v, rb_cArithSeq)
218
+ #else
219
+ || rb_obj_is_kind_of(v, rb_cEnumerator)
220
+ #endif
221
+ ) {
214
222
  nary_step_sequence(v,&length,&dbeg,&dstep);
215
223
  len += length-1;
216
224
  mdai->type = na_mdai_object_type(mdai->type, v);
@@ -465,11 +473,13 @@ na_s_array_shape(VALUE mod, VALUE ary)
465
473
  @return [Numo::NArray]
466
474
  @example
467
475
  Numo::NArray.new_like([[1,2,3],[4,5,6]])
468
- => Numo::Int32#shape=[2,3](empty)
476
+ # => Numo::Int32#shape=[2,3](empty)
477
+
469
478
  Numo::DFloat.new_like([[1,2],[3,4]])
470
- => Numo::DFloat#shape=[2,2](empty)
479
+ # => Numo::DFloat#shape=[2,2](empty)
480
+
471
481
  Numo::NArray.new_like([1,2i,3])
472
- => Numo::DComplex#shape=[3](empty)
482
+ # => Numo::DComplex#shape=[3](empty)
473
483
  */
474
484
  VALUE
475
485
  na_s_new_like(VALUE type, VALUE obj)
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  data.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-2019 Masahiro TANAKA
5
5
  */
6
6
 
7
7
  #include <ruby.h>
@@ -186,21 +186,21 @@ check_axis(int axis, int ndim)
186
186
  @example
187
187
  x = Numo::Int32[[1,2,3]]
188
188
 
189
- p x.swapaxes(0,1)
190
- # Numo::Int32(view)#shape=[3,1]
189
+ x.swapaxes(0,1)
190
+ # => Numo::Int32(view)#shape=[3,1]
191
191
  # [[1],
192
192
  # [2],
193
193
  # [3]]
194
194
 
195
- p x = Numo::Int32[[[0,1],[2,3]],[[4,5],[6,7]]]
196
- # Numo::Int32#shape=[2,2,2]
195
+ x = Numo::Int32[[[0,1],[2,3]],[[4,5],[6,7]]]
196
+ # => Numo::Int32#shape=[2,2,2]
197
197
  # [[[0, 1],
198
198
  # [2, 3]],
199
199
  # [[4, 5],
200
200
  # [6, 7]]]
201
201
 
202
- p x.swapaxes(0,2)
203
- # Numo::Int32(view)#shape=[2,2,2]
202
+ x.swapaxes(0,2)
203
+ # => Numo::Int32(view)#shape=[2,2,2]
204
204
  # [[[0, 4],
205
205
  # [2, 6]],
206
206
  # [[1, 5],
@@ -457,7 +457,7 @@ VALUE
457
457
  na_flatten_dim(VALUE self, int sd)
458
458
  {
459
459
  int i, nd, fd;
460
- size_t j;
460
+ size_t j, ofs;
461
461
  size_t *c, *pos, *idx1, *idx2;
462
462
  size_t stride;
463
463
  size_t *shape, size;
@@ -501,7 +501,6 @@ na_flatten_dim(VALUE self, int sd)
501
501
  case NARRAY_FILEMAP_T:
502
502
  stride = nary_element_stride(self);
503
503
  for (i=sd+1; i--; ) {
504
- //printf("data: i=%d shpae[i]=%ld stride=%ld\n",i,shape[i],stride);
505
504
  SDX_SET_STRIDE(na2->stridx[i],stride);
506
505
  stride *= shape[i];
507
506
  }
@@ -522,32 +521,35 @@ na_flatten_dim(VALUE self, int sd)
522
521
  SDX_SET_INDEX(na2->stridx[i],idx2);
523
522
  } else {
524
523
  na2->stridx[i] = na1->stridx[i];
525
- //printf("view: i=%d stridx=%d\n",i,SDX_GET_STRIDE(sdx));
526
524
  }
527
525
  }
528
526
  // flat dimenion == last dimension
529
527
  if (RTEST(na_check_ladder(self,sd))) {
530
- //if (0) {
531
528
  na2->stridx[sd] = na1->stridx[nd-1];
532
529
  } else {
533
530
  // set index
534
- idx2 = ALLOC_N(size_t, shape[sd]);
531
+ idx2 = ALLOC_N(size_t, (shape[sd]==0) ? 1 : shape[sd]);
535
532
  SDX_SET_INDEX(na2->stridx[sd],idx2);
536
533
  // init for md-loop
537
534
  fd = nd-sd;
538
- c = ALLOC_N(size_t, fd);
535
+ c = ALLOCA_N(size_t, fd);
539
536
  for (i=0; i<fd; i++) c[i]=0;
540
- pos = ALLOC_N(size_t, fd+1);
537
+ pos = ALLOCA_N(size_t, fd+1);
541
538
  pos[0] = 0;
542
539
  // md-loop
543
540
  for (i=j=0;;) {
544
541
  for (; i<fd; i++) {
545
542
  sdx = na1->stridx[i+sd];
546
543
  if (SDX_IS_INDEX(sdx)) {
547
- pos[i+1] = pos[i] + SDX_GET_INDEX(sdx)[c[i]];
544
+ if (SDX_GET_INDEX(sdx)) {
545
+ ofs = SDX_GET_INDEX(sdx)[c[i]];
546
+ } else {
547
+ ofs = 0;
548
+ }
548
549
  } else {
549
- pos[i+1] = pos[i] + SDX_GET_STRIDE(sdx)*c[i];
550
+ ofs = SDX_GET_STRIDE(sdx)*c[i];
550
551
  }
552
+ pos[i+1] = pos[i] + ofs;
551
553
  }
552
554
  idx2[j++] = pos[i];
553
555
  for (;;) {
@@ -559,8 +561,7 @@ na_flatten_dim(VALUE self, int sd)
559
561
  }
560
562
  }
561
563
  loop_end:
562
- xfree(pos);
563
- xfree(c);
564
+ ;
564
565
  }
565
566
  break;
566
567
  }
@@ -589,28 +590,30 @@ na_flatten(VALUE self)
589
590
  @return [Numo::NArray] diagonal view of NArray.
590
591
  @example
591
592
  a = Numo::DFloat.new(4,5).seq
592
- => Numo::DFloat#shape=[4,5]
593
- [[0, 1, 2, 3, 4],
594
- [5, 6, 7, 8, 9],
595
- [10, 11, 12, 13, 14],
596
- [15, 16, 17, 18, 19]]
593
+ # => Numo::DFloat#shape=[4,5]
594
+ # [[0, 1, 2, 3, 4],
595
+ # [5, 6, 7, 8, 9],
596
+ # [10, 11, 12, 13, 14],
597
+ # [15, 16, 17, 18, 19]]
597
598
  b = a.diagonal(1)
598
- => Numo::DFloat(view)#shape=[4]
599
- [1, 7, 13, 19]
599
+ # => Numo::DFloat(view)#shape=[4]
600
+ # [1, 7, 13, 19]
601
+
600
602
  b.store(0)
601
603
  a
602
- => Numo::DFloat#shape=[4,5]
603
- [[0, 0, 2, 3, 4],
604
- [5, 6, 0, 8, 9],
605
- [10, 11, 12, 0, 14],
606
- [15, 16, 17, 18, 0]]
604
+ # => Numo::DFloat#shape=[4,5]
605
+ # [[0, 0, 2, 3, 4],
606
+ # [5, 6, 0, 8, 9],
607
+ # [10, 11, 12, 0, 14],
608
+ # [15, 16, 17, 18, 0]]
609
+
607
610
  b.store([1,2,3,4])
608
611
  a
609
- => Numo::DFloat#shape=[4,5]
610
- [[0, 1, 2, 3, 4],
611
- [5, 6, 2, 8, 9],
612
- [10, 11, 12, 3, 14],
613
- [15, 16, 17, 18, 4]]
612
+ # => Numo::DFloat#shape=[4,5]
613
+ # [[0, 1, 2, 3, 4],
614
+ # [5, 6, 2, 8, 9],
615
+ # [10, 11, 12, 3, 14],
616
+ # [15, 16, 17, 18, 4]]
614
617
  */
615
618
  static VALUE
616
619
  na_diagonal(int argc, VALUE *argv, VALUE self)
@@ -83,6 +83,7 @@ unless have_type("u_int64_t", stdint)
83
83
  have_type("uint64_t", stdint)
84
84
  end
85
85
  have_func("exp10")
86
+ have_func("rb_arithmetic_sequence_extract")
86
87
 
87
88
  have_var("rb_cComplex")
88
89
 
@@ -57,6 +57,10 @@ module NArrayMethod
57
57
  def_method(meth, "accum_index")
58
58
  end
59
59
 
60
+ def accum_arg(meth)
61
+ def_method(meth, "accum_arg")
62
+ end
63
+
60
64
  def cum(meth, cmacro)
61
65
  def_method(meth, "cum", cmacro:cmacro)
62
66
  end
@@ -303,6 +303,8 @@ if is_comparable
303
303
  accum "ptp","dtype","cT"
304
304
  accum_index "max_index"
305
305
  accum_index "min_index"
306
+ accum_arg "argmax"
307
+ accum_arg "argmin"
306
308
  def_method "minmax"
307
309
  def_module_function "maximum", "ewcomp", n_arg:2
308
310
  def_module_function "minimum", "ewcomp", n_arg:2
@@ -366,6 +368,7 @@ cn = get(:class_name)
366
368
  nm = get(:name)
367
369
  st = get(:simd_type)
368
370
  dp = get(:is_double_precision)
371
+ algn = get(:need_align)
369
372
  is_c = is_complex
370
373
 
371
374
  def_module do
@@ -377,8 +380,9 @@ def_module do
377
380
  set module_name: "Math"
378
381
  set module_var: "mTM"
379
382
  set simd_type: st
380
- set is_double_precision: dp
383
+ set is_double_precision: dp
381
384
  set is_complex: is_c
385
+ set need_align: algn
382
386
 
383
387
  math "sqrt"
384
388
  math "cbrt"
@@ -22,8 +22,8 @@ static void
22
22
  <% else %>
23
23
  @overload <%=name%>(axis:nil, keepdims:false)
24
24
  <% end %>
25
- @param [Numeric,Array,Range] axis (keyword) Affected dimensions.
26
- @param [TrueClass] keepdims (keyword) If true, the reduced axes are left in the result array as dimensions with size one.
25
+ @param [Numeric,Array,Range] axis Performs <%=name%> along the axis.
26
+ @param [TrueClass] keepdims If true, the reduced axes are left in the result array as dimensions with size one.
27
27
  @return [Numo::<%=class_name%>] returns result of <%=name%>.
28
28
  */
29
29
  static VALUE
@@ -0,0 +1,88 @@
1
+ <% (is_float ? ["","_nan"] : [""]).each do |j|
2
+ [64,32].each do |i| %>
3
+ #define idx_t int<%=i%>_t
4
+ static void
5
+ <%=c_iter%>_arg<%=i%><%=j%>(na_loop_t *const lp)
6
+ {
7
+ size_t n, idx;
8
+ char *d_ptr, *o_ptr;
9
+ ssize_t d_step;
10
+
11
+ INIT_COUNTER(lp, n);
12
+ INIT_PTR(lp, 0, d_ptr, d_step);
13
+
14
+ idx = f_<%=name[3..5]%>_index<%=j%>(n,d_ptr,d_step);
15
+
16
+ o_ptr = NDL_PTR(lp,1);
17
+ *(idx_t*)o_ptr = (idx_t)idx;
18
+ }
19
+ #undef idx_t
20
+ <% end;end %>
21
+
22
+ /*
23
+ Index of the <%=name[3..5]%>imum value.
24
+ <% if is_float %>
25
+ @overload <%=name%>(axis:nil, nan:false)
26
+ @param [TrueClass] nan If true, apply NaN-aware algorithm (return NaN posision if exist).
27
+ <% else %>
28
+ @overload <%=name%>(axis:nil)
29
+ <% end %>
30
+ @param [Numeric,Array,Range] axis Finds <%=name[3..5]%>imum values along the axis and returns **indices along the axis**.
31
+ @return [Integer,Numo::Int] returns the result indices.
32
+ @see #<%=name[3..5]%>_index
33
+ @see #<%=name[3..5]%>
34
+
35
+ @example
36
+ <% case name; when /min/ %>
37
+ a = Numo::NArray[3,4,1,2]
38
+ a.argmin #=> 2
39
+
40
+ b = Numo::NArray[[3,4,1],[2,0,5]]
41
+ b.argmin #=> 4
42
+ b.argmin(axis:1) #=> [2, 1]
43
+ b.argmin(axis:0) #=> [1, 1, 0]
44
+ b.at(b.argmin(axis:0), 0..-1) #=> [2, 0, 1]
45
+ <% when /max/ %>
46
+ a = Numo::NArray[3,4,1,2]
47
+ a.argmax #=> 1
48
+
49
+ b = Numo::NArray[[3,4,1],[2,0,5]]
50
+ b.argmax #=> 5
51
+ b.argmax(axis:1) #=> [1, 2]
52
+ b.argmax(axis:0) #=> [0, 0, 1]
53
+ b.at(b.argmax(axis:0), 0..-1) #=> [3, 4, 5]
54
+ <% end %>
55
+ */
56
+ static VALUE
57
+ <%=c_func(-1)%>(int argc, VALUE *argv, VALUE self)
58
+ {
59
+ narray_t *na;
60
+ VALUE reduce;
61
+ ndfunc_arg_in_t ain[2] = {{Qnil,0},{sym_reduce,0}};
62
+ ndfunc_arg_out_t aout[1] = {{0,0,0}};
63
+ ndfunc_t ndf = {0, STRIDE_LOOP_NIP|NDF_FLAT_REDUCE|NDF_EXTRACT, 2,1, ain,aout};
64
+
65
+ GetNArray(self,na);
66
+ if (na->ndim==0) {
67
+ return INT2FIX(0);
68
+ }
69
+ if (na->size > (~(u_int32_t)0)) {
70
+ aout[0].type = numo_cInt64;
71
+ ndf.func = <%=c_iter%>_arg64;
72
+ <% if is_float %>
73
+ reduce = na_reduce_dimension(argc, argv, 1, &self, &ndf, <%=c_iter%>_arg64_nan);
74
+ <% else %>
75
+ reduce = na_reduce_dimension(argc, argv, 1, &self, &ndf, 0);
76
+ <% end %>
77
+ } else {
78
+ aout[0].type = numo_cInt32;
79
+ ndf.func = <%=c_iter%>_arg32;
80
+ <% if is_float %>
81
+ reduce = na_reduce_dimension(argc, argv, 1, &self, &ndf, <%=c_iter%>_arg32_nan);
82
+ <% else %>
83
+ reduce = na_reduce_dimension(argc, argv, 1, &self, &ndf, 0);
84
+ <% end %>
85
+ }
86
+
87
+ return na_ndloop(&ndf, 2, self, reduce);
88
+ }
@@ -70,7 +70,7 @@ static VALUE
70
70
  @overload <%=op_map%>(other, axis:nil, keepdims:false)
71
71
  <% end %>
72
72
  @param [Numo::NArray,Numeric] other
73
- @param [Numeric,Array,Range] axis (keyword) Affected dimensions.
73
+ @param [Numeric,Array,Range] axis Performs <%=name%> along the axis.
74
74
  @param [TrueClass] keepdims (keyword) If true, the reduced axes are left in the result array as dimensions with size one.
75
75
  <% if is_float %>
76
76
  @param [TrueClass] nan (keyword) If true, apply NaN-aware algorithm (avoid NaN if exists).
@@ -21,27 +21,38 @@ static void
21
21
  <% end;end %>
22
22
 
23
23
  /*
24
- <%=name%>. Return an index of result.
24
+ Index of the <%=name[0..2]%>imum value.
25
25
  <% if is_float %>
26
26
  @overload <%=name%>(axis:nil, nan:false)
27
27
  @param [TrueClass] nan If true, apply NaN-aware algorithm (return NaN posision if exist).
28
28
  <% else %>
29
29
  @overload <%=name%>(axis:nil)
30
30
  <% end %>
31
- @param [Numeric,Array,Range] axis Affected dimensions.
32
- @return [Integer,Numo::Int] returns result index of <%=name%>.
31
+ @param [Numeric,Array,Range] axis Finds <%=name[0..2]%>imum values along the axis and returns **flat 1-d indices**.
32
+ @return [Integer,Numo::Int] returns result indices.
33
+ @see #arg<%=name[0..2]%>
34
+ @see #<%=name[0..2]%>
35
+
33
36
  @example
34
- <% if name == 'min_index' %>
35
- Numo::NArray[3,4,1,2].min_index => 2
36
- Numo::NArray[[3,4,1],[2,0,5]].min_index => 4
37
- Numo::NArray[[3,4,1],[2,0,5]].min_index(axis: 1) => [2, 4]
38
- Numo::NArray[[3,4,1],[2,0,5]].min_index(axis: 0) => [3, 4, 2]
39
- <% else %>
40
- Numo::NArray[3,4,1,2].max_index => 1
41
- Numo::NArray[[3,4,1],[2,0,5]].max_index => 5
42
- Numo::NArray[[3,4,1],[2,0,5]].max_index(axis: 1) => [1, 5]
43
- Numo::NArray[[3,4,1],[2,0,5]].max_index(axis: 0) => [0, 1, 5]
44
- <% end %>
37
+ <% case name; when /min/ %>
38
+ a = Numo::NArray[3,4,1,2]
39
+ a.min_index #=> 2
40
+
41
+ b = Numo::NArray[[3,4,1],[2,0,5]]
42
+ b.min_index #=> 4
43
+ b.min_index(axis:1) #=> [2, 4]
44
+ b.min_index(axis:0) #=> [3, 4, 2]
45
+ b[b.min_index(axis:0)] #=> [2, 0, 1]
46
+ <% when /max/ %>
47
+ a = Numo::NArray[3,4,1,2]
48
+ a.max_index #=> 1
49
+
50
+ b = Numo::NArray[[3,4,1],[2,0,5]]
51
+ b.max_index #=> 5
52
+ b.max_index(axis:1) #=> [1, 5]
53
+ b.max_index(axis:0) #=> [0, 1, 5]
54
+ b[b.max_index(axis:0)] #=> [3, 4, 5]
55
+ <% end %>
45
56
  */
46
57
  static VALUE
47
58
  <%=c_func(-1)%>(int argc, VALUE *argv, VALUE self)