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.
- checksums.yaml +4 -4
- data/README.md +12 -6
- data/Rakefile +4 -63
- data/ext/numo/narray/array.c +35 -32
- data/ext/numo/narray/data.c +40 -43
- data/ext/numo/narray/depend.erb +6 -10
- data/ext/numo/narray/extconf.rb +24 -21
- data/ext/numo/narray/gen/cogen.rb +2 -2
- data/ext/numo/narray/gen/narray_def.rb +5 -1
- data/ext/numo/narray/gen/spec.rb +17 -7
- data/ext/numo/narray/gen/tmpl/accum.c +2 -2
- data/ext/numo/narray/gen/tmpl/accum_arg.c +88 -0
- data/ext/numo/narray/gen/tmpl/accum_binary.c +1 -1
- data/ext/numo/narray/gen/tmpl/accum_index.c +25 -14
- data/ext/numo/narray/gen/tmpl/alloc_func.c +4 -1
- data/ext/numo/narray/gen/tmpl/allocate.c +1 -0
- data/ext/numo/narray/gen/tmpl/aref.c +5 -35
- data/ext/numo/narray/gen/tmpl/aset.c +7 -37
- data/ext/numo/narray/gen/tmpl/bincount.c +7 -7
- data/ext/numo/narray/gen/tmpl/cast.c +7 -0
- data/ext/numo/narray/gen/tmpl/clip.c +11 -15
- data/ext/numo/narray/gen/tmpl/cum.c +1 -1
- data/ext/numo/narray/gen/tmpl/each.c +4 -2
- data/ext/numo/narray/gen/tmpl/each_with_index.c +5 -2
- data/ext/numo/narray/gen/tmpl/lib.c +2 -2
- data/ext/numo/narray/gen/tmpl/logseq.c +6 -5
- data/ext/numo/narray/gen/tmpl/map_with_index.c +5 -6
- data/ext/numo/narray/gen/tmpl/median.c +2 -2
- data/ext/numo/narray/gen/tmpl/minmax.c +1 -1
- data/ext/numo/narray/gen/tmpl/poly.c +4 -4
- data/ext/numo/narray/gen/tmpl/qsort.c +1 -1
- data/ext/numo/narray/gen/tmpl/rand.c +8 -6
- data/ext/numo/narray/gen/tmpl/rand_norm.c +18 -16
- data/ext/numo/narray/gen/tmpl/seq.c +5 -4
- data/ext/numo/narray/gen/tmpl/sort.c +3 -3
- data/ext/numo/narray/gen/tmpl/sort_index.c +2 -2
- data/ext/numo/narray/gen/tmpl/store_array.c +14 -2
- data/ext/numo/narray/gen/tmpl/unary_s.c +55 -31
- data/ext/numo/narray/gen/tmpl_bit/allocate.c +1 -0
- data/ext/numo/narray/gen/tmpl_bit/aref.c +22 -30
- data/ext/numo/narray/gen/tmpl_bit/aset.c +20 -34
- data/ext/numo/narray/gen/tmpl_bit/binary.c +48 -14
- data/ext/numo/narray/gen/tmpl_bit/bit_count.c +5 -0
- data/ext/numo/narray/gen/tmpl_bit/bit_reduce.c +5 -0
- data/ext/numo/narray/gen/tmpl_bit/store_array.c +14 -2
- data/ext/numo/narray/gen/tmpl_bit/store_bit.c +27 -9
- data/ext/numo/narray/gen/tmpl_bit/unary.c +25 -7
- data/ext/numo/narray/index.c +363 -59
- data/ext/numo/narray/math.c +2 -2
- data/ext/numo/narray/narray.c +151 -36
- data/ext/numo/narray/ndloop.c +4 -4
- data/ext/numo/narray/numo/intern.h +3 -2
- data/ext/numo/narray/numo/narray.h +37 -14
- data/ext/numo/narray/numo/ndloop.h +2 -2
- data/ext/numo/narray/numo/template.h +11 -15
- data/ext/numo/narray/numo/types/complex.h +2 -2
- data/ext/numo/narray/numo/types/int16.h +5 -2
- data/ext/numo/narray/numo/types/int32.h +0 -1
- data/ext/numo/narray/numo/types/int64.h +0 -1
- data/ext/numo/narray/numo/types/int8.h +1 -2
- data/ext/numo/narray/numo/types/uint16.h +5 -2
- data/ext/numo/narray/numo/types/uint32.h +0 -1
- data/ext/numo/narray/numo/types/uint64.h +0 -1
- data/ext/numo/narray/numo/types/uint8.h +1 -2
- data/ext/numo/narray/numo/types/xint_macro.h +2 -0
- data/ext/numo/narray/step.c +58 -252
- data/ext/numo/narray/struct.c +3 -3
- data/lib/numo/narray.rb +1 -7
- data/lib/numo/narray/extra.rb +214 -213
- data/numo-narray.gemspec +7 -8
- metadata +17 -36
data/ext/numo/narray/struct.c
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
strut.c
|
3
|
-
Numerical Array
|
4
|
-
(C)
|
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(
|
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
|
}
|
data/lib/numo/narray.rb
CHANGED
data/lib/numo/narray/extra.rb
CHANGED
@@ -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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
|
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
|
-
#
|
183
|
-
#
|
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
|
-
# @
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
291
|
+
# a = Numo::DFloat[[1, 2], [3, 4]]
|
330
292
|
# a = Numo::Int32[[1, 1], [2, 2], [3, 3]]
|
331
293
|
#
|
332
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
|
513
|
-
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
|
694
|
-
|
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
|
-
|
699
|
-
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
962
|
-
# # Numo::DFloat#shape=[4]
|
929
|
+
# x.diff
|
930
|
+
# # => Numo::DFloat#shape=[4]
|
963
931
|
# # [1, 2, 3, -7]
|
964
932
|
#
|
965
|
-
#
|
966
|
-
# # Numo::DFloat#shape=[3]
|
933
|
+
# x.diff(2)
|
934
|
+
# # => Numo::DFloat#shape=[3]
|
967
935
|
# # [1, 1, -10]
|
968
936
|
#
|
969
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
1194
|
-
#
|
1195
|
-
#
|
1196
|
-
#
|
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
|
-
#
|
1234
|
-
#
|
1235
|
-
#
|
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)
|