Numpy: рд╕рд░рдгреА рдЬреИрд╕реА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП `np.vdot` рдореЗрдВ рдХреНрд░реИрд╢

рдХреЛ рдирд┐рд░реНрдорд┐рдд 10 рдЕрдЧре░ 2019  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: numpy/numpy

numpy.vdot рд╕реЗрдЧрдлрд▓реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдХреЛрдИ рдРрд╕реА рд╡рд╕реНрддреБ рдЙрддреНрддреАрд░реНрдг рдХрд░рддрд╛ рд╣реИ рдЬреЛ __array__ рдЧреИрд░-рдорд╛рдирдХ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИред

рдХреЛрдб рдХреА рдЗрд╕ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕реЗрдЧрдлрд╝реЙрд▓реНрдЯ рд╣реЛрддрд╛ рд╣реИ:
https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/multiarraymodule.c#L2245
рдХреЗ рдмрд╛рдж рд╕реЗ type рд╣реЛ рд╕рдХрддрд╛ рд╣реИ NULL рдЕрдЧрд░ PyArray_DescrFromType рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред

рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛:

import numpy as np

class Foo(object):
     def __array__(self, a):
         return self

np.vdot(Foo(), Foo())

рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢:

рдмреИрдХрдЯреНрд░реЗрд╕:

(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
  * frame #0: 0x0000000100cef88e _multiarray_umath.cpython-37m-darwin.so`array_vdot + 126
    frame #1: 0x00000001005e0994 python`PyCFunction_Call + 148
    frame #2: 0x0000000100c48dc1 _multiarray_umath.cpython-37m-darwin.so`array_implement_array_function + 305
    frame #3: 0x00000001005e11b3 python`_PyMethodDef_RawFastCallKeywords + 227
    frame #4: 0x00000001005e071c python`_PyCFunction_FastCallKeywords + 44
    frame #5: 0x00000001006b6048 python`call_function + 664
    frame #6: 0x00000001006b2a18 python`_PyEval_EvalFrameDefault + 27080
    frame #7: 0x00000001006b6e45 python`_PyEval_EvalCodeWithName + 2997
    frame #8: 0x00000001005e06d6 python`_PyFunction_FastCallKeywords + 230
    frame #9: 0x00000001006b60d9 python`call_function + 809
    frame #10: 0x00000001006b2987 python`_PyEval_EvalFrameDefault + 26935
    frame #11: 0x00000001006b6e45 python`_PyEval_EvalCodeWithName + 2997
    frame #12: 0x00000001006abfb0 python`PyEval_EvalCode + 48
    frame #13: 0x00000001006ee677 python`PyRun_InteractiveOneObjectEx + 615
    frame #14: 0x00000001006ede4e python`PyRun_InteractiveLoopFlags + 190
    frame #15: 0x00000001006edd5c python`PyRun_AnyFileExFlags + 60
    frame #16: 0x0000000100710c51 python`pymain_main + 7873
    frame #17: 0x000000010071127f python`_Py_UnixMain + 111
    frame #18: 0x00007fff5f6e63d5 libdyld.dylib`start + 1

Numpy / рдкрд╛рдпрдерди рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рдирдХрд╛рд░реА:

рдореИрдВрдиреЗ рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ рдХреЗ рд╕рд╛рде рдЗрд╕ рджреЛрдиреЛрдВ рдХреЛ рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рд╣реИ:

1.17.0 3.7.2 (default, Jan 16 2019, 11:36:28)
[Clang 10.0.0 (clang-1000.11.45.2)]

рдФрд░ рдПрдХ рдЖрдВрддрд░рд┐рдХ рд▓рд┐рдирдХреНрд╕ рдмрд┐рд▓реНрдб рдкрд░ред

рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдореВрд▓ рд░реВрдк рд╕реЗ https://github.com/google/jax/issues/1162 рдХреЗ рд░реВрдк рдореЗрдВ рдмрддрд╛рдИ рдЧрдИ рдереА

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

рд╣рдореНрдо, vdot рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ dtype рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ (рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдареАрдХ рд╣реИ)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ NPY_NOTYPE рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм NPY_NOTYPE рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/multiarraymodule.c#L2241 (рдФрд░ рдирд┐рдореНрди рдкрдВрдХреНрддрд┐) рдореЗрдВ рд╣реИ, рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рджреЗрдЦреА рдЧрдИ рддреНрд░реБрдЯрд┐ рдмрд╛рдж рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд▓реМрдЯрд╛рдиреА рдЪрд╛рд╣рд┐рдП (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд╣рд╛рдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рднреА рдареАрдХ рд╣реЛрдЧрд╛)ред

рдХреНрдпрд╛ рдЖрдк рдПрдХ рдкреАрдЖрд░ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

(рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЕрдзрд┐рдХ рд╕рдорд╛рди рдЙрдкрдпреЛрдЧ рд╣реИрдВ рдЬрд╣рд╛рдБ рддреНрд░реБрдЯрд┐ рдЬрд╛рдБрдЪ рдЧрд╛рдпрдм рд╣реИред)

рдирдорд╕реНрддреЗ,
рдореИрдВ рдПрдХ рдирд╡рд╛рдЧрдВрддреБрдХ рд╣реВрдВ рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдХрд╣рд╛рдБ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░ рдХреЛрдИ рд╕реБрд░рд╛рдЧ?
рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдзрдиреНрдпрд╡рд╛рджред

рд╣рдорд╛рд░реЗ developement рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝реЗрдВред рдлрд┐рд░ рдЖрдкрдХреЛ рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рдкрд╣реБрдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рдЖрдк python runtests.py master рд╢рд╛рдЦрд╛ ( git checkout master; git clean -xfd; python runtests.py ) рдЪрд▓рд╛ рд╕рдХреЗрдВред

рдЬрдм рдЖрдк рд╕реЗрдЯ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╣реИрдХрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдПрдХ рд╢рд╛рдЦрд╛ рдмрдирд╛рдПрдВ, рдПрдХ рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝реЗрдВ ( numpy/core/tests/teste_multiarray.py TestVDot рдПрдХ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рд╣реЛрдЧреА), рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕рдВрдХреЗрдд рд╕реЗ C рдХреЛрдб рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ ред рдпрджрд┐ рдЖрдк рдорджрдж рдХреЗ рд▓рд┐рдП рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдпрд╣ рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдиреЗ рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдЪреНрдЪрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдФрд░ рдмреЗрд╣рддрд░ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ред

рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ @ Soniyanayak51!

@Mattip рдиреЗ рдЬреЛ рдХрд╣рд╛,

@rgommers @mattip рдореИрдВрдиреЗ PyArray_DescrFromType () рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдЬреЛрдбрд╝реЗ рд╣реИрдВред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореБрдЭреЗ рдЙрдиреНрд╣реЗрдВ PyArray_DESCR () рдХреЗ рд▓рд┐рдП рднреА рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, test_multiarray.py рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдХреНрдпрд╛ рдореБрдЭреЗ рдПрдХ test_PyArrayType рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рдкреНрд░рдХрд╛рд░ NULL рд╣реИ? рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╣реИред

@rgommers @mattip рдореИрдВрдиреЗ PyArray_DescrFromType () рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдЬреЛрдбрд╝реЗ рд╣реИрдВред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореБрдЭреЗ рдЙрдиреНрд╣реЗрдВ PyArray_DESCR () рдХреЗ рд▓рд┐рдП рднреА рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, test_multiarray.py рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдХреНрдпрд╛ рдореБрдЭреЗ рдПрдХ test_PyArrayType рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рдкреНрд░рдХрд╛рд░ NULL рд╣реИ? рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╣реИред

рд▓рдЧрддрд╛ рд╣реИ @mattip рдиреЗ рдЗрд╕ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ PR (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ) рдкрд░ рдЬрд╡рд╛рдм рджрд┐рдпрд╛ред рд╕рдВрднрд╡рдд: рдмрд╛рддрдЪреАрдд рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдПред

рдХреНрдпрд╛ рдореБрдЭреЗ рдПрдХ test_PyArrayType рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рдкреНрд░рдХрд╛рд░ NULL рд╣реИ?

рдереЛрдбрд╝рд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП: рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗрд╡рд▓ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╣реИред рддреЛ рдЖрдк рд▓реЗрдВрдЧреЗ

...
np.vdot(Foo(), Foo())

рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рд╡рд░рдг рд╕реЗ, рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ C API рдХрд╛ рдЕрд▓рдЧ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

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

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

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

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

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

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

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