Skip to main content

Expressive array utilities with an optional C backend.

Project description

smartarr

smartarr is an expressive array utility layer for Python with a clean smart(arr) API and an optional C backend for fast core operations.

Why it exists

The goal is simple:

  • one readable interface for lists, tuples, and NumPy arrays
  • fast common operations when the C extension is available
  • chainable transformations that still feel like Python
from smartarr import smart

value = smart([1, 2, 3, 4, 5]).rotate(2).reverse().middle()
print(value)  # 1

Install

Local install from this project:

python -m pip install .

Editable install for development:

python -m pip install -e .

Optional NumPy support:

python -m pip install ".[numpy]"

If a compiler is available, smartarr builds its C extension automatically. If not, installation still succeeds and falls back to the pure Python backend.

Quick start

from smartarr import smart

arr = smart([1, 2, 3, 4])

print(arr.first())                 # 1
print(arr.last())                  # 4
print(arr.middle())                # 3
print(arr.middle(mode="left"))     # 2
print(arr.middle(mode="avg"))      # 2.5
print(arr.size())                  # 4
print(len(arr))                    # 4
print(arr.rotate(1).to_list())     # [4, 1, 2, 3]
print(arr.reverse().to_list())     # [4, 3, 2, 1]
print(arr.chunk(2).to_list())      # [[1, 2], [3, 4]]
print(arr.window(2).to_list())     # [[1, 2], [2, 3], [3, 4]]
print(arr.peaks().to_list())       # local maxima values
print(arr.peaks(mode="index").to_list())  # local maxima indexes
print(arr.duplicates().to_list())  # unique duplicated values
print(arr.duplicates(mode="all").to_list())  # every repeated occurrence after the first
print(arr.argmax())                # 3
print(arr.argsort().to_list())     # [0, 1, 2, 3]

Design notes

  • middle() defaults to the right-middle element for even-length arrays, matching arr[len(arr) // 2].
  • SmartArray operations are non-mutating by default. Methods like rotate() and reverse() return a new wrapper and leave the original array unchanged.
  • Prefer len(arr) or arr.size() for length checks. arr.len() remains as a compatibility alias.
  • Structural methods return a new SmartArray, so chaining works naturally.
  • Terminal methods return a final value, such as an element, a number, or a dictionary.
  • Flat transformations preserve the original adapter where practical. Shape-changing operations return list-shaped data by default.
  • random() returns one element when n is omitted, samples without replacement when replace=False, and samples with replacement when replace=True. A seed makes output deterministic.
  • sample(frac) selects a fraction of the array. By default it samples without replacement and preserves the original order of selected elements.
  • shuffle() returns a randomly reordered copy.
  • peaks() returns local maxima values by default. Use mode="index" to return their positions.
  • duplicates() returns each duplicated value once by default. Use mode="all" to return every repeated occurrence after the first.
  • flatten() performs a deep recursive flatten across nested iterables, except string-like values such as str, bytes, and bytearray.
  • flatten() follows the iteration order of the source containers. Ordered iterables stay ordered; unordered iterables such as set keep their native iteration behavior.
  • reshape() validates that the requested shape exactly matches the flattened element count.
  • window() returns an empty result when the requested window size is larger than the array length.
  • reduce() requires either a non-empty array or an explicit initial value.
  • frequency() returns counts in first-seen insertion order on Python 3.7+.
  • take(), drop(), and remove_at() support negative indexes and raise clear IndexErrors when out of range.
  • group_by() returns a dict of lists, and partition() returns a native tuple of lists.
  • shape() requires a regular rectangular nested structure.
  • join() requires string elements. split() is the inverse helper for a one-element string array.
  • lazy() records operations and runs them later with execute().

Performance Notes

  • The current C backend accelerates core access and array operations such as first, last, middle, rotate, reverse, find, count, contains, chunk, window, and is_sorted.
  • Higher-level methods such as map, filter, reduce, sum, mean, median, peaks, unique, duplicates, frequency, flatten, and reshape currently run in Python.
  • This means the API is already hybrid, but the biggest performance wins will come from moving heavier algorithms into the C layer over time.

Supported input types

  • list
  • tuple
  • NumPy ndarray when NumPy is installed
  • general iterables such as range

Current feature coverage

Access and Position

  • first
  • last
  • middle
  • len
  • size
  • is_empty
  • find
  • indices
  • count
  • contains
  • argmax
  • argmin
  • argsort

Structural and Slicing

  • rotate
  • reverse
  • chunk
  • window
  • slice
  • take
  • drop
  • flatten
  • reshape
  • insert
  • remove_at
  • replace

Grouping and Combination

  • group_by
  • partition
  • zip
  • zip_with

Numeric and Rolling

  • sum
  • mean
  • median
  • min
  • max
  • diff
  • cumsum
  • rolling_mean
  • rolling_max
  • top_k
  • bottom_k

Filtering and Boolean

  • map
  • filter
  • where
  • reduce
  • mask
  • random
  • sample
  • shuffle

Set-like and Comparison

  • union
  • intersection
  • difference
  • sorted
  • sort_by
  • is_sorted
  • equals
  • is_unique
  • has_duplicates
  • unique
  • duplicates
  • frequency
  • peaks

Shape, Strings, and Debug

  • shape
  • ndim
  • join
  • split
  • inspect
  • summary
  • lazy

Development

Run tests:

python -m unittest discover -s tests -v

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

smartarr-0.2.0.tar.gz (18.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

smartarr-0.2.0-cp311-cp311-win_amd64.whl (22.6 kB view details)

Uploaded CPython 3.11Windows x86-64

File details

Details for the file smartarr-0.2.0.tar.gz.

File metadata

  • Download URL: smartarr-0.2.0.tar.gz
  • Upload date:
  • Size: 18.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.12

File hashes

Hashes for smartarr-0.2.0.tar.gz
Algorithm Hash digest
SHA256 a4f0f7db7ef19b74fddeae92fe18de63ba694973e42e7335bdeea063021cecdb
MD5 fa705bcd5c27806c424128813c6d347a
BLAKE2b-256 9477580ab480f4d6285ea3406514d6eeb7faf4d9ae564ece01f9f99ce782fe47

See more details on using hashes here.

File details

Details for the file smartarr-0.2.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: smartarr-0.2.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 22.6 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.12

File hashes

Hashes for smartarr-0.2.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 fad22505e19f42d9e9d26e0a2d8840335b877af9bb98672e7b9c5341131c4891
MD5 52d6fee372c8ee03fc55ada5d82913d5
BLAKE2b-256 72092225986ff1f96355c856e8fbd1a5130bd941da060aa61706fd940bf93b17

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page