Hello Numpy community,

I'm proposing the introduction of a `pipe` method for NumPy arrays to enhance 
their usability and expressiveness.
Similar to other data processing libraries like pandas, a `pipe` method would 
allow users to chain operations together in a more readable and intuitive 
manner.
Consider the following examples where method chaining with `pipe` can improve 
code readability compared to traditional NumPy code:

# ********************************************************************
# Class PipeableArray just for illustration

import numpy as np

class PipeableArray:
    def __init__(self, array: np.ndarray):
        self.array = array

    def pipe(self, func, *args, **kwargs):
        """Apply function and return the result wrapped in PipeableArray."""
        try:
            result = func(self.array, *args, **kwargs)
            return PipeableArray(result)
        except Exception as exc:
            print('Ups, something went wrong...')

    def __repr__(self):
        return repr(self.array)

# ********************************************************************
# Original code using traditional NumPy chaining
arr = np.array([1, 2, 3, 4, 5])
arr = np.square(arr)
arr = np.log(arr)
arr = np.cumsum(arr)

# Original code using traditional NumPy nested functions
arr = np.arange(1., 5.)
result = np.cumsum(np.log(np.square(arr)))

# ********************************************************************
# Proposed Numpy method chaining using a new pipe method

arr = PipeableArray(np.arange(1., 5.))
result = (arr
          .pipe(np.square)
          .pipe(np.log)
          .pipe(np.cumsum)
)
# ********************************************************************

Benefits:
- Readability: Method chaining with pipe offers a more readable and intuitive 
way to express complex data transformations, making the intended data 
processing pipeline easier to understand.
- Customization: The pipe method allows users to chain custom functions or 
already implemented NumPy operations seamlessly.
- Modularity: Users can define reusable functions and chain them together using 
pipe, leading to cleaner and more maintainable code.
- Consistency: Introducing a pipe method in NumPy aligns with similar 
functionality available in other libraries like pandas, polars, etc.
- Optimization: While NumPy may not currently optimize chained expressions, the 
introduction of pipe lays the groundwork for potential future optimizations 
with lazy evaluation.

I believe this enhancement could benefit the NumPy community by providing a 
more flexible and expressive way to work with arrays.
I'd love to see such a feature in Numpy and like to hear your thoughts on this 
proposal.

Best regards,
Oyibo
_______________________________________________
NumPy-Discussion mailing list -- numpy-discussion@python.org
To unsubscribe send an email to numpy-discussion-le...@python.org
https://mail.python.org/mailman3/lists/numpy-discussion.python.org/
Member address: arch...@mail-archive.com

Reply via email to