Numpy: рдЧрд▓рдд рдЖрдЙрдЯ рд╢реЗрдк рдкрд░ рдЧреБрдирдЧреБрдирд╛ рд╡реНрдпрд╡рд╣рд╛рд░

рдХреЛ рдирд┐рд░реНрдорд┐рдд 2 рдЬреВрди 2020  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: numpy/numpy

рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рд╕реЗ: https://github.com/numpy/numpy/pull/15162#discussion_r434122175

рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рддрдм рд╕рд╛рдордиреЗ рдЖрддреА рд╣реИ рдЬрдм рдЖрдЙрдЯ рдЖрдХрд╛рд░ рдЧрд▓рдд рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдЗрдирдкреБрдЯ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо + рдХрдЪрд░рд╛ рдорд╛рди рдХреЗ рд╕рд╛рде рдЪреБрдкрдЪрд╛рдк рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓ рджреЗрддрд╛ рд╣реИред

import numpy as np
from numpy.core import _umath_tests as umt
from numpy.testing import assert_raises
a = np.arange(6).reshape(3, 2)
b = np.ones(2)
out = np.empty((5, 3))
umt.inner1d(a, b, out)
print(out)

рдкрд░рд┐рдгрд╛рдо:

[[ 1.00000000e+000  5.00000000e+000  9.00000000e+000]
 [ 6.91217735e-310 -1.45681599e+144 -1.45681599e+144]
 [-1.45681599e+144 -1.45681599e+144 -1.45681599e+144]
 [-1.45681599e+144 -1.45681599e+144 -1.45681599e+144]
 [-1.45681599e+144 -1.45681599e+144  6.32404027e-322]]
00 - Bug numpy.core numpy.ufunc

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЖрд╣, рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ:

diff --git a/numpy/core/src/umath/ufunc_object.c b/numpy/core/src/umath/ufunc_object.c
index 19876d641..85820e3a0 100644
--- a/numpy/core/src/umath/ufunc_object.c
+++ b/numpy/core/src/umath/ufunc_object.c
@@ -2614,7 +2614,7 @@ PyUFunc_GeneralizedFunction(PyUFuncObject *ufunc,
      * dimensions.
      */
     broadcast_ndim = 0;
-    for (i = 0; i < nin; ++i) {
+    for (i = 0; i < nop; ++i) {
         int n = PyArray_NDIM(op[i]) - op_core_num_dims[i];
         if (n > broadcast_ndim) {
             broadcast_ndim = n;

рд╢рд╛рдпрдж рдпрд╣ рд╕рдм рд╡рд╣рд╛рдБ рд╣реИред рдлрд┐рд░ рд╣рдо рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдЗрдирдкреБрдЯреНрд╕ рдХрд╛ рд╕рд╣реА рдкреНрд░рд╕рд╛рд░рдг рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рдЕрдкрджрд╕реНрде рдХрд░рдиреЗ рдХреЗ рдХрд┐рд╕реА рднреА рд╡рд┐рдЪрд╛рд░ рдХреЛ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдердЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рдпрд╣ рдХрднреА рднреА рд╕рд╛рдордиреЗ рдЖрддрд╛ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдкреНрд▓рд╕ рд╕реЗрд╢рди рдХреА рд╢реВрдиреНрдп рдЬрд╛рдВрдЪ ...

рд╕рднреА 5 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╣реЗ , рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛тАжред рд╕рд┐рд░реНрдл рдорд╛рдорд▓реЗ рдореЗрдВ

NPY_ITER_NO_BROADCAST рдзреНрд╡рдЬ, рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд▓рдЧрддрд╛ рд╣реИ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдПрдХ рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдмрд╕ рдЙрд╕ рдСрдкрд░реИрдВрдб рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрдХрд╛рд░ рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рд╕реЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ)ред рд▓реЗрдХрд┐рди, рдпрд╣ рдПрдХ рдЕрд╕рдВрдЧрдд рд╡рд┐рд░рд╛рдо рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдЙрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдЗрд╕рд▓рд┐рдП рдореИрдВ рдПрдХ рдирдпрд╛ NPY_ITER_OUTPUT_OPERAND рдЬреЛрдбрд╝рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрд╛ рдПрдХ NPY_ITER_OUTPUT_OPERAND рдФрд░ рдПрдХ рдФрд░ рдЭрдВрдбрд╛ NPY_ITER_DOES_NOT_AFFECT_SHAPE рдмрдирд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рдСрдкрд░реЗрдВрдб рдзреНрд╡рдЬ рдореЗрдВ "рдЖрд╡рдВрдЯрд┐рдд" рдФрд░ "рдХреЛрдИ рдкреНрд░рд╕рд╛рд░рдг рдирд╣реАрдВ" рдЭрдВрдбреЗ рджреЛрдиреЛрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХреЗрдВред

рдпрд╣ рдЖрд╡рдВрдЯрд┐рдд рдФрд░ рдмрд┐рдирд╛ рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреА рддрд░рд╣ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ, рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИред рд▓реЗрдХрд┐рди рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХрд╛ рдмрджрд▓рд╛рд╡ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдпрд╣ NpyIter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рд╣рд░реА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред (рдЬрдм рддрдХ рд╣рдо рдЗрд╕реЗ рдПрдХ рд╡рд┐рдЬрд┐рдмрд▓рдбрд┐рдкрд░реЗрдХреНрд╢рди рд╡рд░реНрдЬрди рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрдм рдпрд╣ рдЕрдВрджрд░ рдШреБрд╕рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рдл рд╣реИред)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджрд┐рд▓рдЪрд╕реНрдк рдкрдХреНрд╖ рдорд╛рдорд▓реЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдХреБрд▓реНрд╣рд╛рдбрд╝реА рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ (рдпрд╛ рдЕрдзрд┐рдХ) рдЖрдЙрдЯрдкреБрдЯ рд╕рд░рдгрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИред рдПрдХ (рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░?) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓рд╛рдн рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ (),()->(k) gufunc рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рджреЗрдЦрддрд╛ред (),()->(3,3) рдпрд╛ ->(3,3) рддрд░рд╣ рдХреБрдЫ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИред

рд╕рднреА рдЭрдВрдбреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд, рдореБрдЭреЗ рдорд╛рдирдирд╛ тАЛтАЛрд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдПрдХ gufunc moments рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдХреЗ рд╕рд╛рде ()->(k) рд╢рд╛рдпрдж k рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдХреНрд╖рдгреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдмрд╣реБрдд рджреВрд░ рдХреА рдмрд╛рдд рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реА рд╕рдордЭ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реЛрдЧреА (рди рд╣реА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб!)ред

рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдПрдХ рдЕрд╕рдВрдЧрдд рдмрд╛рд╣рд░реА рдЖрдХреГрддрд┐ рд╣реИ, рдпрд╣ рд╣реИ рдХрд┐ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ ufuncs рд╕реЗ рдорд┐рд╕рд╛рд▓ рд╣реИ:

np.add(1, 1, out=np.empty((3,)))
# array([2., 2., 2.])

рдпрд╣ рднреА gufuncs рдХреЗ рд▓рд┐рдП рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ, рдмрд╛рд╣рд░реА рдЖрдХрд╛рд░ рд╕рднреА рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЧрдгрдирд╛ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реЛ ...

рдУрд╣, рдореБрдЭреЗ рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рдЙрдореНрдореАрдж рдирд╣реАрдВ рдереА рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЗрдирдкреБрдЯреНрд╕ рдореЗрдВ рдкреНрд░рд╕рд╛рд░рдг рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЖрдХрд╛рд░ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ред

рдЗрд╕рд▓рд┐рдП, рдмрд╕ рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░реЗрдВ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ (рдЫ) ufunc рдХреЛ рдХрдИ рдмрд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╣ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдзреАрдорд╛ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЙрд▓рд░реНрд╕ рд╕рдорд╕реНрдпрд╛ рд╣реИ)ред рдЬрдмрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдореБрдЭреЗ рдЗрд╕реЗ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрднреА рднреА рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ!

рдЖрд╣, рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ:

diff --git a/numpy/core/src/umath/ufunc_object.c b/numpy/core/src/umath/ufunc_object.c
index 19876d641..85820e3a0 100644
--- a/numpy/core/src/umath/ufunc_object.c
+++ b/numpy/core/src/umath/ufunc_object.c
@@ -2614,7 +2614,7 @@ PyUFunc_GeneralizedFunction(PyUFuncObject *ufunc,
      * dimensions.
      */
     broadcast_ndim = 0;
-    for (i = 0; i < nin; ++i) {
+    for (i = 0; i < nop; ++i) {
         int n = PyArray_NDIM(op[i]) - op_core_num_dims[i];
         if (n > broadcast_ndim) {
             broadcast_ndim = n;

рд╢рд╛рдпрдж рдпрд╣ рд╕рдм рд╡рд╣рд╛рдБ рд╣реИред рдлрд┐рд░ рд╣рдо рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдЗрдирдкреБрдЯреНрд╕ рдХрд╛ рд╕рд╣реА рдкреНрд░рд╕рд╛рд░рдг рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рдЕрдкрджрд╕реНрде рдХрд░рдиреЗ рдХреЗ рдХрд┐рд╕реА рднреА рд╡рд┐рдЪрд╛рд░ рдХреЛ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдердЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рдпрд╣ рдХрднреА рднреА рд╕рд╛рдордиреЗ рдЖрддрд╛ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдкреНрд▓рд╕ рд╕реЗрд╢рди рдХреА рд╢реВрдиреНрдп рдЬрд╛рдВрдЪ ...

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Levstyle picture Levstyle  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

amuresan picture amuresan  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

marcocaccin picture marcocaccin  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

manuels picture manuels  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

MorBilly picture MorBilly  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ