Numpy: BUG : ๋ถ€๋ถ„์ ์œผ๋กœ ์ผ์น˜ํ•˜๋Š” ์ฐจ์›์„ ๊ฐ€์ง„ ๋ฐฐ์—ด ๋ชฉ๋ก์—์„œ np.array๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2016๋…„ 03์›” 23์ผ  ยท  8์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: numpy/numpy

numpy.array ๋ฐ numpy.asarray ํ•จ์ˆ˜๋Š” ๋ฐฐ์—ด ๋ชฉ๋ก์— ์ ์šฉ๋  ๋•Œ ์ž˜ ์ •์˜ ๋œ ๋™์ž‘์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ๋‚˜์—ด๋œ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ์™€ ํฌ๊ธฐ๊ฐ€ ๊ฐ™์œผ๋ฉด ๋ชฉ๋ก์ด ๊ฒฐ๊ณผ ๋ฐฐ์—ด์˜ ์ฐจ์› ์ค‘ ํ•˜๋‚˜๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค ( " ๋ชจ๋“œ 1 "). ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฐฐ์—ด ๋ฐฐ์—ด์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค ( "๋ชจ๋“œ 2").

๊ทธ๋Ÿฌ๋‚˜ "๋ชจ๋“œ 2"์—์„œ numpy.array ๋ฐ numpy.asarray์˜ ๋™์ž‘์€ ๋ฐฐ์—ด์˜ ํ•ญ๋ชฉ ์ˆ˜์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ๋Š” numpy ์œ ์šฉ์„ฑ์— ๋น„ํ•ด ๋งค์šฐ ์šฐ์•„ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

>>> a = np.array([1, 2, 3])
>>> b = np.array([[1, 0], [0, 1]])
>>> np.asarray([a, b])
array([array([1, 2, 3]), array([[1, 0],
       [0, 1]])], dtype=object)

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

>>> a = np.array([1, 2])
>>> b = np.array([[1, 0], [0, 1]])
>>> np.asarray([a, b])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.4/dist-packages/numpy/core/numeric.py", line 474, in asarray
    return array(a, dtype, copy=False, order=order)
ValueError: could not broadcast input array from shape (2,2) into shape (2)

๋ถ„๋ช…ํžˆ ๋ฌธ์ œ๋Š” numpy.asarray๊ฐ€ ์ฒซ ๋ฒˆ์งธ ์ฐจ์›์ด a ๋ฐ b ์—์„œ ๋™์ผํ•œ ๊ธธ์ด๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๋ฉด ์—ฌ๊ธฐ์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•œ "๋ชจ๋“œ 1"๋กœ ์ด๋™ํ•˜๋ ค๊ณ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘ : numpy 1.10.4 ๋ฐ python 3.4.3์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

00 - Bug numpy.core

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

dtype=object ์ œ๊ณตํ•ด๋„ ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋นˆ ๋ฐฐ์—ด์„ ์ถ”๊ฐ€ํ•˜๋ฉด์ด๋ฅผ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

arr_of_arr = np.array([np.array([]), a, b])[1:]

๋ชจ๋“  8 ๋Œ“๊ธ€

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ํด๋ฐฑ ๋กœ์ง์€ ๋ถˆํ–‰ํ•ฉ๋‹ˆ๋‹ค. dtype์ด ๋ช…์‹œ ์ ์œผ๋กœ ์ œ๊ณต๋˜์ง€ ์•Š๋Š” ํ•œ dtype=object ๋ฐฐ์—ด์„ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. IMO np.array([a, b], dtype=object) ๋Š” ์ด๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด์–ด์•ผํ•˜๋ฉฐ ๋ชจ์–‘์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

dtype=object ์ œ๊ณตํ•ด๋„ ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋นˆ ๋ฐฐ์—ด์„ ์ถ”๊ฐ€ํ•˜๋ฉด์ด๋ฅผ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

arr_of_arr = np.array([np.array([]), a, b])[1:]

1.14.4์— ์—ฌ์ „ํžˆ ์กด์žฌ

@ppwwyyxx- ์‚ฌ์‹ค, ๋ถ€๋ถ„์ ์œผ๋กœ๋Š” ์‚ฌ์†Œํ•œ ๋ณ€ํ™”๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋ถ„์ ์œผ๋กœ๋Š” ํ•ญ์ƒ ํƒ€๊ฒฉ์„ ์ž…๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธด๊ธ‰ ์„ฑ์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋‚ฎ์Šต๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  ๊ธฐ์—ฌํ•  ์‹œ๊ฐ„์ด ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์—†์Šต๋‹ˆ๋‹ค ...).

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์„œ ๋„์›€์ด ๋  ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ ์›ํ•˜๋Š” ๋™์ž‘์ด ์ •ํ™•ํžˆ ๋ฌด์—‡์ธ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. @shoyer ๋Š” ์‹ค์ œ๋กœ ์›ํ•  ๊ฒฝ์šฐ dtype=object ๋ฅผ ๋ช…์‹œ ์ ์œผ๋กœ ์š”๊ตฌํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ˆซ์ž ๋˜๋Š” ๋ฌธ์ž์—ด ๋ฐฐ์—ด๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ ํ•  ์ˆ˜์—†๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์— ๋Œ€ํ•ด TypeError ๋ฅผ ์˜ฌ๋ฆฌ๋ผ๋Š” ์˜ค๋žœ ์š”์ฒญ๋„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค (# 5353). ๋‚˜๋Š” ์ตœ๊ทผ์— ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ชฉ๋ก๊ณผ ๊ตฌ์กฐํ™” ๋œ dtype์˜ ์š”์†Œ๋กœ ํŠœํ”Œ ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ์—„๊ฒฉํ•˜๊ฒŒ ์ ์šฉํ•˜๋Š” dtype='structured' ๋ฅผ ์œ ์‚ฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•œ ์ง€ ๊ณ ๋ฏผํ•ด ์™”์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ ์ €์—๊ฒŒ ๋ฌด์—‡์„ํ•ด์•ผํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์กฐ์–ธ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ธฐ๊บผ์ด ๊ธฐ์—ฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ctors.c์˜ ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด ๋ณด์•˜๋Š”๋ฐ, ์ƒ์„ฑ์ž ๋…ผ๋ฆฌ๋Š” ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋ฏ€๋กœ ์ƒ๋‹นํžˆ ๋ณต์žกํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๊ฐ™์€ ํ˜ธ : # 8330

๋‚˜๋Š” ์ด๊ฒƒ์ด # 11601์— ์˜ํ•ด ๊ณ ์ณ์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŽธ์ง‘ : ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ์„œ ์ผ์–ด๋‚˜๋Š” ์ผ์€ ๋Œ€๋žต ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

a = np.array([1, 2])
b = np.array([[1, 0], [0, 1]])
out = np.asarray([a, b])
# translates to
out = np.empty((2, 2))  #shape is correctly inferred
out[0,:] = a
out[1,:] = b  # error comes from here
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰