1. Is there a technical reason for `choose` not accept a `dtype` argument? 2. Separately, mypy is unhappy with my 2nd argument to `choose`: Argument 2 to "choose" has incompatible type "Tuple[int, Sequence[float]]"; expected "Union[Union[int, float, complex, str, bytes, generic], Sequence[Union[int, float, complex, str, bytes, generic]], Sequence[Sequence[Any]],_SupportsArray]" However, `choose` is happy to have e.g. `choices=(0,seq)` (and I hope it will remain so!). E.g., a = a = (0,1,1,0,0,0,1,1) #binary array np.choose((0,range(8)) #array([0, 1, 2, 0, 0, 0, 6, 7]) Thanks, Alan Isaac
1. I suppose it only uses the (Native int or int64) dtype since each one
would need a code path to run quickly.
2. I would describe this a a bug. I think sequences are converted to arrays
and in this case the conversion is not returning a 2 element object array
but expanding and then concatenation.
Kevin
On Sat, Apr 17, 2021, 18:56 Alan G. Isaac
1. Is there a technical reason for `choose` not accept a `dtype` argument?
2. Separately, mypy is unhappy with my 2nd argument to `choose`: Argument 2 to "choose" has incompatible type "Tuple[int, Sequence[float]]"; expected "Union[Union[int, float, complex, str, bytes, generic], Sequence[Union[int, float, complex, str, bytes, generic]], Sequence[Sequence[Any]],_SupportsArray]" However, `choose` is happy to have e.g. `choices=(0,seq)` (and I hope it will remain so!).
E.g., a = a = (0,1,1,0,0,0,1,1) #binary array np.choose((0,range(8)) #array([0, 1, 2, 0, 0, 0, 6, 7])
Thanks, Alan Isaac _______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@python.org https://mail.python.org/mailman/listinfo/numpy-discussion
I think you are saying that this current behavior of `choose` should be considered a bug. I hope not, because as illustrated, it is useful. How would you propose to efficiently do the same substitutions? On 4/17/2021 4:27 PM, Kevin Sheppard wrote:
2. I would describe this a a bug. I think sequences are converted to arrays and in this case the conversion is not returning a 2 element object array but expanding and then concatenation.
On Sat, Apr 17, 2021, 18:56 Alan G. Isaac
mailto:alan.isaac@gmail.com> wrote:
2. Separately, mypy is unhappy with my 2nd argument to `choose`: Argument 2 to "choose" has incompatible type "Tuple[int, Sequence[float]]"; expected "Union[Union[int, float, complex, str, bytes, generic], Sequence[Union[int, float, complex, str, bytes, generic]], Sequence[Sequence[Any]],_SupportsArray]" However, `choose` is happy to have e.g. `choices=(0,seq)` (and I hope it will remain so!).
E.g., a = a = (0,1,1,0,0,0,1,1) #binary array np.choose(a, (0,range(8)) #array([0, 1, 2, 0, 0, 0, 6, 7])
On Sat, Apr 17, 2021 at 4:28 PM Kevin Sheppard
1. I suppose it only uses the (Native int or int64) dtype since each one would need a code path to run quickly.
2. I would describe this a a bug. I think sequences are converted to arrays and in this case the conversion is not returning a 2 element object array but expanding and then concatenation.
No, it's broadcasting the two to a common shape, as documented. https://numpy.org/doc/stable/reference/generated/numpy.choose.html
E.g.,
a = a = (0,1,1,0,0,0,1,1) #binary array np.choose(a, (0,range(8)) #array([0, 1, 2, 0, 0, 0, 6, 7])
This is equivalent to `np.choose(a, (np.zeros(8, dtype=int), range(8)))` -- Robert Kern
Oh. I answered thinking about choice and not choose. Please ignore both
parts.
On Sun, Apr 18, 2021, 17:56 Robert Kern
On Sat, Apr 17, 2021 at 4:28 PM Kevin Sheppard
wrote: 1. I suppose it only uses the (Native int or int64) dtype since each one would need a code path to run quickly.
2. I would describe this a a bug. I think sequences are converted to arrays and in this case the conversion is not returning a 2 element object array but expanding and then concatenation.
No, it's broadcasting the two to a common shape, as documented. https://numpy.org/doc/stable/reference/generated/numpy.choose.html
E.g.,
a = a = (0,1,1,0,0,0,1,1) #binary array np.choose(a, (0,range(8)) #array([0, 1, 2, 0, 0, 0, 6, 7])
This is equivalent to `np.choose(a, (np.zeros(8, dtype=int), range(8)))`
-- Robert Kern _______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@python.org https://mail.python.org/mailman/listinfo/numpy-discussion
After a taking a closer look at the `np.choose` docs I think we should change `choices: npt.ArrayLike` into `choices: Sequence[npt.ArrayLike]`.
This would resolve the issue, but it’d also mean that directly passing an array will be prohibited (as far as type checkers are concerned).
The docs do mention that the outermost container should be a list or tuple anyway, so I’m not convinced that this new typing restriction would be a huge loss.
Regards, Bas
From: NumPy-Discussion
On Mon, Apr 19, 2021 at 12:24 PM bas van beek
After a taking a closer look at the `np.choose` docs I think we should change `*choices: npt.ArrayLike` into `choices: Sequence[npt.ArrayLike]`.*
*This would resolve the issue, but it’d also mean that directly passing an array will be prohibited (as far as type checkers are concerned).*
*The docs do mention that the outermost container should be a list or tuple anyway, so I’m not convinced that this new typing restriction would be a huge loss.*
Why not allow both? -- Robert Kern
participants (4)
-
Alan G. Isaac
-
bas van beek
-
Kevin Sheppard
-
Robert Kern