>  if a single program uses both np.polyval() and np.polynomail.Polynomial,
it seems bound to cause unnecessary confusion.

Yes, I would recommend definitely not doing that!

> I still think it would make more sense for np.polyval() to use
conventional indexing

Unfortunately, it's too late for "making sense" to factor into the design.
`polyval` is being used in the wild, so we're stuck with it behaving the
way it does. At best, we can deprecate it and start telling people to move
from `np.polyval` over to `np.polynomial.polynomial.polyval`. Perhaps we
need to make this namespace less cumbersome in order for that to be a
reasonable option.

I also wonder if we want a more lightweight polynomial object without the
extra domain and range information, which seem like they make `Polynomial`
a more questionable drop-in replacement for `poly1d`.

Eric

On Sat, 30 Jun 2018 at 09:14 Maxwell Aifer <mai...@haverford.edu> wrote:

> Thanks, that explains a lot! I didn't realize the reverse ordering
> actually originated with matlab's polyval, but that makes sense given the
> one-based indexing. I see why it is the way it is, but I still think it
> would make more sense for np.polyval() to use conventional indexing (c[0]
> * x^0 + c[1] * x^1 + c[2] * x^2). np.polyval() can be convenient when a
> polynomial object is just not needed, but if a single program uses both
> np.polyval() and np.polynomail.Polynomial, it seems bound to cause
> unnecessary confusion.
>
> Max
>
> On Fri, Jun 29, 2018 at 11:23 PM, Eric Wieser <wieser.eric+nu...@gmail.com
> > wrote:
>
>> Here's my take on this, but it may not be an accurate summary of the
>> history.
>>
>> `np.poly<func>` is part of the original matlab-style API, built around
>> `poly1d` objects. This isn't a great design, because they represent:
>>
>>     p(x) = c[0] * x^2 + c[1] * x^1 + c[2] * x^0
>>
>> For this reason, among others, the `np.polynomial` module was created,
>> starting with a clean slate. The core of this is
>> `np.polynomial.Polynomial`. There, everything uses the convention
>>
>>     p(x) = c[0] * x^0 + c[1] * x^1 + c[2] * x^2
>>
>> It sounds like we might need clearer docs explaining the difference, and
>> pointing users to the more sensible `np.polynomial.Polynomial`
>>
>> Eric
>>
>>
>>
>> On Fri, 29 Jun 2018 at 20:10 Charles R Harris <charlesr.har...@gmail.com>
>> wrote:
>>
>>> On Fri, Jun 29, 2018 at 8:21 PM, Maxwell Aifer <mai...@haverford.edu>
>>> wrote:
>>>
>>>> Hi,
>>>> I noticed some frustrating inconsistencies in the various ways to
>>>> evaluate polynomials using numpy. Numpy has three ways of evaluating
>>>> polynomials (that I know of) and each of them has a different syntax:
>>>>
>>>>    -
>>>>
>>>>    numpy.polynomial.polynomial.Polynomial
>>>>    
>>>> <https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.polynomial.polynomial.Polynomial.html#numpy.polynomial.polynomial.Polynomial>:
>>>>    You define a polynomial by a list of coefficients *in order of
>>>>    increasing degree*, and then use the class’s call() function.
>>>>    -
>>>>
>>>>    np.polyval
>>>>    
>>>> <https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.polyval.html>:
>>>>    Evaluates a polynomial at a point. *First* argument is the
>>>>    polynomial, or list of coefficients *in order of decreasing degree*,
>>>>    and the *second* argument is the point to evaluate at.
>>>>    -
>>>>
>>>>    np.polynomial.polynomial.polyval
>>>>    
>>>> <https://docs.scipy.org/doc/numpy-1.12.0/reference/generated/numpy.polynomial.polynomial.polyval.html>:
>>>>    Also evaluates a polynomial at a point, but has more support for
>>>>    vectorization. *First* argument is the point to evaluate at, and
>>>>    *second* argument the list of coefficients *in order of increasing
>>>>    degree*.
>>>>
>>>> Not only the order of arguments is changed between different methods,
>>>> but the order of the coefficients is reversed as well, leading to puzzling
>>>> bugs (in my experience). What could be the reason for this madness? As
>>>> polyval is a shameless ripoff of Matlab’s function of the same name
>>>> <https://www.mathworks.com/help/matlab/ref/polyval.html> anyway, why
>>>> not just use matlab’s syntax (polyval([c0, c1, c2...], x)) across the
>>>> board?
>>>> ​
>>>>
>>>>
>>> The polynomial package, with its various basis, deals with series, and
>>> especially with the truncated series approximations that are used in
>>> numerical work. Series are universally written in increasing order of the
>>> degree. The Polynomial class is efficient in a single variable, while the
>>> numpy.polynomial.polynomial.polyval function is intended as a building
>>> block and can also deal with multivariate polynomials or multidimensional
>>> arrays of polynomials, or a mix. See the simple implementation of polyval3d
>>> for an example. If you are just dealing with a single variable, use
>>> Polynomial, which will also track scaling and offsets for numerical
>>> stability and is generally much superior to the simple polyval function
>>> from a numerical point of view.
>>>
>>> As to the ordering of the degrees, learning that the degree matches the
>>> index is pretty easy and is a more natural fit for the implementation code,
>>> especially as the number of variables increases. I note that Matlab has
>>> ones based indexing, so that was really not an option for them.
>>>
>>> Chuck
>>> _______________________________________________
>>> NumPy-Discussion mailing list
>>> NumPy-Discussion@python.org
>>> https://mail.python.org/mailman/listinfo/numpy-discussion
>>>
>>
>> _______________________________________________
>> NumPy-Discussion mailing list
>> NumPy-Discussion@python.org
>> https://mail.python.org/mailman/listinfo/numpy-discussion
>>
>>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion@python.org
> https://mail.python.org/mailman/listinfo/numpy-discussion
>
_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@python.org
https://mail.python.org/mailman/listinfo/numpy-discussion

Reply via email to