Numpy: np.random.choice๋Š” ๋งˆ์Šคํฌ ๋ฐฐ์—ด prob์—์„œ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2020๋…„ 08์›” 15์ผ  ยท  6์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: numpy/numpy

import numpy as np

a = np.array([0.1, 0.2, 0.4, 0.3])
masked_a = np.ma.masked_array(a, [0, 0, 1, 1])
counter = np.zeros(len(a) + 1)
while True:
    action = np.random.choice(len(a), p=masked_a)
    counter[action] += 1
    print(counter / counter.sum())

# [0.09931198 0.20076697 0.         0.         0.69992105]

์ธ๋ฑ์Šค> 3์„ ๋ฐ˜ํ™˜ํ•ด์„œ๋Š” ์•ˆ๋˜์ง€๋งŒ ๋งˆ์Šคํ‚น ๋œ ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๊ฐ€ ์ฐธ์ด๋ฉด index = 4๋ฅผ ๋ฐ˜ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

00 - Bug numpy.ma numpy.random

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

์ด ๋ฌธ์ œ๋Š” numpy ๊ฐœ๋ฐœ ๋ฒ„์ „์˜ Generator.choice ์—์„œ๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

In [1]: import numpy as np

In [2]: np.__version__ 
Out[2]: '1.20.0.dev0+986e533'

In [3]: rng = np.random.default_rng()

In [4]: pm = np.ma.masked_array([0.1, 0.2, 0.4, 0.3], mask=[0, 0, 1, 1])

In [5]: rng.choice(4, p=pm, size=12)
Out[5]: array([4, 4, 4, 0, 4, 1, 4, 0, 0, 4, 4, 4])

์•ž์„œ "๋ฒ„๊ทธ"๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ ๊ทธ๊ฒƒ์€ ์ฃผ๊ด€์ ์ธ ํŒ๋‹จ์ž…๋‹ˆ๋‹ค. numpy์—๋Š” ๋งˆ์Šคํ‚น ๋œ ๋ฐฐ์—ด์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (๋˜๋Š” "์ •ํ™•์„ฑ"๋„ ํŒ๋‹จ ํ˜ธ์ถœ์ด ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— "์˜ฌ๋ฐ”๋ฅด๊ฒŒ"). ์—ฌ๊ธฐ์„œ ๋ฐ˜๋“œ์‹œ ๋ฒ„๊ทธ๋กœ ๊ฐ„์ฃผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด๊ฒƒ์€ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์˜ ์˜ˆ์ผ ๋ฟ์ด๋ฉฐ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์งง์€ ๋Œ€๋‹ต์€ "ํ•˜์ง€ ๋งˆ์„ธ์š”!"์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌด์˜๋ฏธํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹  ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋งˆ์Šคํ‚น ๋œ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ๋ช…์‹œ์ ์ธ ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ฐ’์ด ์‹ค์ œ๋กœ ๋งˆ์Šคํ‚น ๋œ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๋งค์šฐ ๊ตฌ์ฒด์ ์ธ ์ž„์‹œ ์ˆ˜์ •์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

Generator.choice ๊ฐ€) __array_function__ ๋ฐœ์†ก๋ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์•„๋งˆ ๊ทธ๋Ÿด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด, ์šฐ๋ฆฌ๊ฐ€ ์•„์ง __array_function__ ๋ฒ„๊ทธ๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋ชจ๋“  "maskedarray decay"์™€ ํ•จ๊ป˜ ์ด๊ฒƒ์„ ๋˜์ง„๋‹ค ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•ž์„œ "๋ฒ„๊ทธ"๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ ๊ทธ๊ฒƒ์€ ์ฃผ๊ด€์ ์ธ ํŒ๋‹จ์ž…๋‹ˆ๋‹ค. numpy์—๋Š” ๋งˆ์Šคํ‚น ๋œ ๋ฐฐ์—ด์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (๋˜๋Š” "์ •ํ™•์„ฑ"๋„ ํŒ๋‹จ ํ˜ธ์ถœ์ด ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— "์˜ฌ๋ฐ”๋ฅด๊ฒŒ"). ์—ฌ๊ธฐ์„œ ๋ฐ˜๋“œ์‹œ ๋ฒ„๊ทธ๋กœ ๊ฐ„์ฃผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด๊ฒƒ์€ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์˜ ์˜ˆ์ผ ๋ฟ์ด๋ฉฐ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์งง์€ ๋Œ€๋‹ต์€ "ํ•˜์ง€ ๋งˆ์„ธ์š”!"์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌด์˜๋ฏธํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹  ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋งˆ์Šคํ‚น ๋œ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ๋ช…์‹œ์ ์ธ ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ฐ’์ด ์‹ค์ œ๋กœ ๋งˆ์Šคํ‚น ๋œ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๋งค์šฐ ๊ตฌ์ฒด์ ์ธ ์ž„์‹œ ์ˆ˜์ •์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด ๋งˆ์Šคํฌ ๋œ ๋ฐฐ์—ด ์ „๋‹ฌ์„ ํ—ˆ์šฉํ•ด์„œ๋Š” ์•ˆ๋˜์ง€๋งŒ (์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์•ผ ํ•จ) ๋Œ€๋ถ€๋ถ„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค (์ผ๋ถ€ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค). ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— ์ž ์žฌ์  ์ธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Generator ์—๋Š” __array_function__ ์‚ฌ์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ํž˜ ์ž…๋ ฅ์ด C ์—ฐ์†์ ์œผ๋กœ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ, ์ผ๋ถ€ ๊ธฐ๋Šฅ์ด ํ•ญ์ƒ์ด๋ฅผ ์ข…๊ต์ ์œผ๋กœ ์ถฉ๋ถ„ํžˆ ๊ฐ•์š”ํ•˜์ง€๋Š” ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

NPY_ARRAY_ENSUREARRAY ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ฐ€๋“ ์ฐจ์„œ ๋งˆ์Šคํฌ๋ฅผ ๋ฌด์‹œํ•˜๋Š” ndarray๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด "์˜ณ๋‹ค"๋ผ๊ณ  ๋งํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. @WarrenWeckesser ์˜ ์˜ˆ์—์„œ๋Š” pm=np.array([.1,.2,.3,.4]) ๋ฅผ ํ™•๋ฅ ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰