@@ -360,6 +360,112 @@ def zeros(cls, *args, size=None, dtype=None, capacity=None, grow_use_add=None, g
360
360
dyn ._size = size
361
361
return dyn
362
362
363
+ @classmethod
364
+ def arange (
365
+ cls , * args , start = None , stop = None , step = None , dtype = None , capacity = None , grow_use_add = None , grow_add = None
366
+ ):
367
+ """
368
+ Create a DynamicVector from evenly spaced values within a given interval
369
+ and specified data type (dtype). If dtype is not given, then it is set to `np.int32`.
370
+
371
+ DynamicVector.zeros(start=1, stop, step=1, dtype=np.int32, capacity=8, *, grow_use_add=None, grow_add=None)
372
+
373
+ `arange` can be called with a varying number of positional arguments:
374
+
375
+ - `arange(stop)`: Values are generated within the half-open interval [0, stop)
376
+ (in other words, the interval including start but excluding stop).
377
+ - `arange(start, stop)`: Values are generated within the half-open interval [start, stop).
378
+ - `arange(start, stop, step)` Values are generated within the half-open interval [start, stop),
379
+ with spacing between values given by step.
380
+ - `arange(start, stop, step, dtype)` Values are generated within the half-open interval [start, stop),
381
+ with spacing between values given by step and has data type, dtype.
382
+
383
+ `arange` can also use keyword argument `start`, `stop`, `step` and `dtype`.
384
+ However, if a positional argument of the same name is used, as described above,
385
+ then only the keywords that are not one of the position arguments names can be used.
386
+ Such as:
387
+
388
+ - `arange(stop)`: Cannot use the keyword `stop`.
389
+ - `arange(start, stop)`: Cannot use the keywords `start`, `stop`.
390
+ - `arange(start, stop, step)` Cannot use the keywords `start`, `stop`, `step`,.
391
+ - `arange(start, stop, step, dtype)` Cannot use the keywords `start`, `stop`, `step`, `dtype`.
392
+
393
+ For integer arguments the function is roughly equivalent to the Python built-in range,
394
+ but returns an DynamicVector rather than a range instance.
395
+
396
+ When using a non-integer step, such as 0.1, it is often better to use `DynamicVector.linspace`.
397
+
398
+ Parameters:
399
+ start (int or float, optional): The starting value of the sequence, defaults to 0.
400
+ stop (int or float): The end value of the sequence.
401
+ step (int or float, optional): The increment (step size). Defaults to 1.
402
+ dtype (type, optional): The type of the output values. Defaults to `np.int32`.
403
+
404
+ Returns:
405
+ DynamicVector of evenly spaced dtype values from given start, stop, and step.
406
+
407
+ Examples:
408
+ DynamicVector.arange(5) -> DynamicVector([0, 1, 2, 3, 4])
409
+ DynamicVector.arange(2, 5) -> DynamicVector([2, 3, 4])
410
+ DynamicVector.arange(2, 10, step=2) -> DynamicVector([2, 4, 6, 8])
411
+ DynamicVector.arange(0, 5, step=0.5) -> DynamicVector([0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5])
412
+ """
413
+ narg = len (args )
414
+ if narg > 5 :
415
+ raise TypeError (f"arange() takes from 0 to 5 positional arguments but { narg } were given" )
416
+ if narg == 0 and stop is None :
417
+ raise TypeError ("DynamicVector.arange() must specify at least one argument or use the `stop=` keyword." )
418
+ if narg == 1 and stop is not None :
419
+ raise TypeError ("DynamicVector.arange() cannot specify 1 positional argument and the `stop=` keyword." )
420
+ if narg == 2 and (stop is not None or start is not None ):
421
+ raise TypeError (
422
+ "DynamicVector.arange() cannot specify 2 positional arguments and the `stop=` or `start=` keywords."
423
+ )
424
+ if narg == 3 and (stop is not None or start is not None or step is not None ):
425
+ raise TypeError (
426
+ "DynamicVector.arange() cannot specify 3 positional arguments "
427
+ "and the `stop=`, `start=`, or `step=` keywords."
428
+ )
429
+ if narg == 4 and (stop is not None or start is not None or step is not None or dtype is not None ):
430
+ raise TypeError (
431
+ "DynamicVector.arange() cannot specify 4 positional arguments "
432
+ "and the `stop=`, `start=`, `step=`, or `dtype=` keywords."
433
+ )
434
+ if narg == 5 and (
435
+ stop is not None or start is not None or step is not None or dtype is not None or capacity is not None
436
+ ):
437
+ raise TypeError (
438
+ "DynamicVector.arange() cannot specify 5 positional arguments "
439
+ "and the `stop=`, `start=`, `step=`, `dtype=`, or `capacity=` keywords."
440
+ )
441
+ # set up default values
442
+ if start is None :
443
+ start = 0
444
+ if step is None :
445
+ step = 1
446
+ if dtype is None :
447
+ dtype = np .int32
448
+ if capacity is None :
449
+ capacity = 8
450
+
451
+ if narg == 1 :
452
+ stop = args [0 ]
453
+ elif narg == 2 :
454
+ start , stop = args
455
+ elif narg == 3 :
456
+ start , stop , step = args
457
+ elif narg == 4 :
458
+ start , stop , step , dtype , capacity = args
459
+
460
+ tmp = np .arange (start , stop , step , dtype )
461
+ dim = tmp .size
462
+ capacity = max (dim , capacity )
463
+
464
+ dyn = cls (dtype , capacity , grow_use_add = grow_use_add , grow_add = grow_add )
465
+ dyn ._size = dim
466
+ dyn ._data [:dim ] = tmp
467
+ return dyn
468
+
363
469
@property
364
470
def size (self ) -> int :
365
471
"""Returns the current size of the vector."""
0 commit comments