Numpy: Enh: рдСрдмреНрдЬреЗрдХреНрдЯ рдРрд░реЗ рдХреНрд░рд┐рдПрд╢рди рдлрдВрдХреНрд╢рди

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

рдЬреИрд╕рд╛ рдХрд┐ рдЕрдВрдХ #5303 рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдорд╛рди-рд▓рдВрдмрд╛рдИ рдЕрдиреБрдХреНрд░рдо рд╡рд╛рд▓реЗ рдСрдмреНрдЬреЗрдХреНрдЯ dtype рдХреЗ рд╕рд░рдгрд┐рдпрд╛рдБ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреБрдХреНрд░рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд░рдгреА рддрддреНрд╡реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдкреНрд░рдореБрдЦ рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрддрддрд╛ рд╡рд┐рд░рд╛рдо рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд▓рдВрдмреА рдмрд╣рд┐рд╖реНрдХрд░рдг рдЕрд╡рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдПрдХ рдЕрдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ dtype рдХреЗ рд╕рд╛рде рд╕рд░рдгрд┐рдпрд╛рдБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реЛред рд╢рд╛рдпрдж рдЗрд╕реЗ "рдСрдмреНрдЬреЗрдХреНрдЯрдПрд░реЗ" рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ 1D рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд░рдгреА рдореЗрдВ рдПрдХ рддрддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реЛрдЧрд╛ред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ "ndim" рдпрд╛ "рдЧрд╣рд░рд╛рдИ" рддрд░реНрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдХрд┐рддрдиреЗ рд╕реНрддрд░реЛрдВ рдХреЛ рд╕рд░рдгреА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 0 рд╣реЛрдЧрд╛ (рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рдмрд╛рд╣рд░реА рд╕реНрддрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдпрджрд┐ рдЖрдпрд╛рдо рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЕрдкрд╡рд╛рдж рдЙрдард╛рдПрдЧрд╛ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдкрд░рд╕реНрдкрд░ рдЕрдирдиреНрдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкреАрдЫреЗ рдХреА рдУрд░-рд╕рдВрдЧрддрддрд╛ рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝реЗрдЧрд╛ред

рддреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))])
>>> arr
array([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], dtype=object)
>>> arr.shape
(2,)

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], depth=1)
>>> arr
array([[(1, 2, 3), (4, 5, 6)],
       [(7, 8, 9), (10, 11, 12)]], dtype=object)
>>> arr.shape
(2, 2)

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], depth=2)
>>> arr
array([[[1, 2, 3],
        [4, 5, 6]],

       [[7, 8, 9],
        [10, 11, 12]]], dtype=object)
>>> arr.shape
(2, 2, 3)

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

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

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

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

>>> a = empty((2,), dtype=np.object)
>>> a[:] = [[1,2,3],[4,5,6]]

>>> b = empty((2,3), dtype=np.object)
>>> b[:] = [[1,2,3],[4,5,6]]

рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ objectarray рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рд╣рд╛рдВ, рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рд╡рд░реНрдмреЛрдЬрд╝ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд┐рдЪрд╛рд░ред

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

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

ndmax рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рдпрд╛ рдпреЛрдЬрдирд╛ рд╣реИ? рдореИрдВ рдЕрднреА рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ:

np.array([*data, None])[:-1]

# This would look a lot cleaner:
np.array(data, ndmax=1)
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕