์ฌ๊ธฐ ํ ๋ก ์์ : 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]]
Hehe, ์ ์ ๋์ ์ด๊ฒ์ ๋ํด ์๊ฐํ๊ณ ์์์ต๋๋ค. ํน์๋ผ๋ @mhvk๋ฅผ ํํฉ๋๋ค.
NPY_ITER_NO_BROADCAST
ํ๋๊ทธ๋ ์ด์ํ๊ฒ๋ ๋ชจ์ ๊ฒ์์ ์ํด ํด๋น ํผ์ฐ์ฐ์๋ฅผ ์์ ํ ์ ๊ฑฐ ํ ์์๋ ๋ฐฉ์์ผ๋ก ๊ฑฐ์ ํญ์ ์ฌ์ฉ๋๋ ๊ฒ ๊ฐ์ต๋๋ค (์ : ์ถ๋ ฅ ์์
). ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ค๋ฉด ๊ทธ๊ฒ์ ํธํ๋์ง ์๋ ํด์์ด ๋ ๊ฒ์
๋๋ค.
๊ทธ๋์ ์๋ก์ด NPY_ITER_OUTPUT_OPERAND
์ถ๊ฐ๋ฅผ ๊ณ ๋ คํ๊ณ ์์ต๋๋ค. ๋๋ NPY_ITER_OUTPUT_OPERAND
๋ฐ ๋ค๋ฅธ ํ๋๊ทธ NPY_ITER_DOES_NOT_AFFECT_SHAPE
๋ฅผ ๋ง๋ค์ด ์ถ๋ ฅ ํผ์ฐ์ฐ์ ํ๋๊ทธ๊ฐ "allocate"๋ฐ "no broadcast"ํ๋๊ทธ๋ฅผ ๋ชจ๋ ํฌํจ ํ ์ ์๋๋กํฉ๋๋ค.
ํ ๋น๊ณผ ๋ฐฉ์ก ๊ธ์ง์ ์กฐํฉ์ฒ๋ผ ๋๊ปด์ง๋ฉฐ, ์๋ง๋ ์ด๋ฏธ ์ด๊ฒ์ ์์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ฌธ์ ๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ฌํ ๋ณ๊ฒฝ์ ์ํ๋ค๋ฉด ์ด๋ก ์ ์ผ๋ก NpyIter๋ฅผ ์ฌ์ฉํ๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ค๋ ๊ฒ์ ๋๋ค. (์์ํ ๋ VisibleDeprecationWarning์ผ๋ก ๋ง๋ค์ง ์๋ ํ, ๊ตฌํํ๊ธฐ์ ๋งค์ฐ ๊น๋ํ์ง ์์ต๋๋ค.)
๋๋ ๊ทธ๊ฒ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ง ์ฌ์ฉ๋๋ ์ถ๊ณผ ๊ฐ์ ํฅ๋ฏธ๋ก์ด ๋ถ์์ ์ธ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. (์ธ์ ๊ฐ๋?) ๊ทธ๊ฒ์ ์ง์ํ๋ ค๊ณ ์๋ ํ ์ ์์ง๋ง ์ค์ ์ด๋์ ์ป์ง ๋ชปํ๋๋ก ๋๋ฌด ๋ณต์ก ํ ์ ์์ต๋๋ค.
(),()->(k)
gufunc์ ๋ํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ง์ด ๋ณด์ง ๋ชปํฉ๋๋ค. (),()->(3,3)
๋๋ ->(3,3)
์ ๊ฐ์ ๊ฒ์ ๋น์ฐํ์ง๋ง ๋ฌธ์ ๊ฐ๋์ง ์์ต๋๋ค.
๋ชจ๋ ๊น๋ฐ์ ๋ํด ์ฝ๊ฐ ํผ๋์ค๋ฌ์์ ์ธ์ ํด์ผํฉ๋๋ค. ๊ทธ๋ฌ๋ ()->(k)
์๋ช
์ด์๋ gufunc moments
๋ ์ถ๋ ฅ์์ โโ์ต๋ k
๊น์ง ์๊ฐ์ ๊ณ์ฐํ ์ ์์ต๋๋ค. ๋ฌผ๋ก , ์์ฒญ๋๊ฒ ๋ฌด๋ฆฌ๊ฐ ์์ง๋ง, ์ ๊ฐ๊ฐ์ ๊ทธ๊ฒ์ ๋ช
์ ์ ์ผ๋ก ๋ฐฐ์ ํ์ง ์๋ ๊ฒ์
๋๋ค (๋ช
์ ์ ์ผ๋ก ๊ทธ๊ฒ์ ํ์ฉํ๋ ์ฝ๋๋ ์๋๋๋ค!).
์ถ๋ ฅ์ด ์ผ๊ด๋์ง ์์ ์ธ๋ถ ๋ชจ์์ ๊ฐ๋ ๋ฌธ์ ์ ๋ ์ง์ ์ ์ผ๋ก ๊ด๋ จ์ด์๋ ๊ฒ์ ์ผ๋ฐ ufuncs์ ์ ๋ก๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค.
np.add(1, 1, out=np.empty((3,)))
# array([2., 2., 2.])
์ด๊ฒ์ gufuncs์ ๊ฒฝ์ฐ์๋ ๋ชจ๋ ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ์์ โโ์ธ๋ถ ๋ชจ์์ ๊ฒฐ์ ํด์ผ ํจ์ ์์ฌํฉ๋๋ค. ๋ถ๋ช ํ ๋ถํ์ํ ๊ณ์ฐ์ ์ ๋ฐํ ๊ฒ์ด์ง๋ง ๊ทธ๋ ๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ค, ์ด๋ป๊ฒ ๋ ๊ทธ๊ฒ์ด ์ค์ ๋ก ์๋ ํ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ์ง ์์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์ถ๋ ฅ์ด ์ ๋ ฅ์์ ๋ธ๋ก๋ ์บ์คํ ์ ์ ๋ฐํ๋๋ก ํ์ฉ ํ ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค (๋ฐ๋ผ์ ๋ชจ์์ ์กฐ์ ). ๊ธฐ๋ณธ์ ์ผ๋ก ๋จ์ํ ํ์ฌ ๋์์ ์ ์งํฉ๋๋ค.
(g) ufunc๊ฐ ์ฌ๋ฌ ๋ฒ ํธ์ถ๋๋์ง ํ์ธํ๋ ๊ฒ ์ธ์๋ ์๋ฌด ์์ ๋ํ์ง ์์ต๋๋ค (๋ง์ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ๋ฐ ์ฝ๊ฐ์ ๋๋ฆฐ ๋ฐฉ๋ฒ์ด์ง๋ง ํธ์ถ์ ๋ฌธ์ ์ ๋๋ค). ์ด๋ฅผ ์ง์ํ๋ ๊ฒ์ด ์ค์ํ์ง ์๋ค๊ณ ์๊ฐํ์ง๋ง ๊ทธ๋ ๊ฒํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ฌ์ ํ gufuncs์์์ด ๋ฌธ์ ๋ฅผ ๋ถ๋ช ํ ๊ณ ์ณ์ผํฉ๋๋ค!
์, ์์ฃผ ๊ฐ๋จํฉ๋๋ค.
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;
์๋ง ๊ทธ๊ฒ ์ ๋ถ์ผ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฐ๋ฆฌ๋ ์ถ๋ ฅ์ ๋ํ ์ ๋ ฅ์ ์ฌ๋ฐ๋ฅธ ๋ฐฉ์ก์ ์ป์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ๋น๋ํ๋ ์๊ฐ์ ๋ฏธ๋์ ์์ ์ ์ํด ์ฐ๊ธฐ ๋ ์ ์์ต๋๋ค.
ํธ์ง : ๊ฒ๋ค๊ฐ op์ null ๊ฒ์ฌ ...
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์, ์์ฃผ ๊ฐ๋จํฉ๋๋ค.
์๋ง ๊ทธ๊ฒ ์ ๋ถ์ผ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฐ๋ฆฌ๋ ์ถ๋ ฅ์ ๋ํ ์ ๋ ฅ์ ์ฌ๋ฐ๋ฅธ ๋ฐฉ์ก์ ์ป์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ๋น๋ํ๋ ์๊ฐ์ ๋ฏธ๋์ ์์ ์ ์ํด ์ฐ๊ธฐ ๋ ์ ์์ต๋๋ค.
ํธ์ง : ๊ฒ๋ค๊ฐ op์ null ๊ฒ์ฌ ...