Numpy: BUG : np.min์ด ํ•ญ์ƒ NaN์„ ์ „ํŒŒํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2018๋…„ 01์›” 11์ผ  ยท  65์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: numpy/numpy

์ด ์กฐ์‚ฌ๋Š” scipy CI๊ฐ€ ์ง€๋‚œ ๋ฉฐ์น  ๋™์•ˆ, ์ฆ‰ 1.14๊ฐ€ ์ถœ์‹œ ๋œ ํ›„ appveyor ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค .

๋‚ด ์ง‘ ์ปดํ“จํ„ฐ (macOS, conda python 3.6.2, conda numpy) :

>>> import numpy as np
>>> np.version.version
'1.14.0'
>>> np.min([1.0, 2.0, np.nan])
nan
>>> np.min([1.0, np.nan, 2.0])
nan
>>> np.min([np.nan, 1.0, 2.0])
nan
>>> np.min([np.nan, 1.0])
/Users/andrew/miniconda3/envs/dev3/lib/python3.6/site-packages/numpy/core/_methods.py:29: RuntimeWarning: invalid value encountered in reduce
  return umr_minimum(a, axis, None, out, keepdims)
nan

๋‚ด ์ง์žฅ ์ปดํ“จํ„ฐ์—์„œ (macOS, conda python 3.6.2, ๊นจ๋—ํ•œ ํ™˜๊ฒฝ์—์„œ pip๋ฅผ ํ†ตํ•ด ์„ค์น˜๋œ numpy) :

>>> import numpy as np
>>> np.version.version
'1.14.0'
>>> np.min([1., 2., 3., 4., np.nan])
nan
>>> np.min([1., 2., 3., np.nan, 4.])
nan
>>> np.min([1., 2., np.nan, 3., 4.])
nan
>>> np.min([1., np.nan, 2., 3., 4.])
nan
>>> np.min([np.nan, 1., 2., 3., 4.])
nan
>>> np.min([np.nan, 1.])
nan
>>> np.min([np.nan, 1., np.nan])
nan
>>> np.min([1., np.nan])
nan
>>> np.seterr(all='raise')
{'divide': 'warn', 'over': 'warn', 'under': 'ignore', 'invalid': 'warn'}
>>> np.min([1., np.nan])
nan
>>> np.min([np.nan, 1.])
nan
>>> np.min([np.nan, 1., 2., 3., 4.])
nan
>>> np.min([np.nan, 1., 2., 3., 4.])
nan

์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ ์˜ˆ์ œ ์„ธํŠธ์—์„œ ์ฒ˜์Œ ์„ธ ๊ฐœ์˜ ์˜ˆ์ œ์—์„œ ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ๋งˆ์ง€๋ง‰ ์˜ˆ์ œ ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
๋‘ ๋ฒˆ์งธ ์˜ˆ์ œ ์„ธํŠธ์—์„œ๋Š” ๊ฒฝ๊ณ ๊ฐ€ ์ „ํ˜€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

00 - Bug numpy.core

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

์™ธ๋ถ€ ์ฐธ์กฐ scipy / scipy # 8282, scipy / scipy # 8279

์—ฌ๊ธฐ์„œ ๋˜ ๋‹ค๋ฅธ ์š”์ ์€ AVX ๋“ฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ (์ •๋ง numpy๊ฐ€ ์•„๋‹Œ) ํ–‰๋™์„ ์œ ๋ฐœํ•˜๋Š” ๋‹ค๋ฅธ ์ฝ”๋“œ ๊ฒฝ๋กœ ์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์•ฝ๊ฐ„ ๋ฌด์ž‘์œ„๋กœ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค ....

๊ทธ๊ฒƒ์ด ๊ทธ๊ฒƒ๊ณผ ๋งŽ์€ ๊ด€๋ จ์ด ์žˆ๋‹ค๋ฉด Dunno, ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ธฐ๋Œ€ํ•˜์ง€๋งŒ, numpy๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ถ€๋™ ์†Œ์ˆ˜์  ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ๋งŽ์ดํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฌด์Šจ ์ผ์ด ์žˆ์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ ๋นผ๊ณ .

Chuck์ด ๋งํ–ˆ๋“ฏ์ด,์ด ๋ถ€๋™ ์†Œ์ˆ˜์  ์˜ค๋ฅ˜ ํ”Œ๋ž˜๊ทธ๋Š” ๋ถˆํ–‰ํžˆ๋„ ์‹œ์Šคํ…œ๋งˆ๋‹ค ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ข‹์•„, ์˜ค๋ฅ˜๊ฐ€ ์ผ๋ถ€ ์„ค์น˜์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๊ณ  ๋‹ค๋ฅธ ์„ค์น˜์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค.
scipy๊ฐ€ NaN์„ ํฌํ•จ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฐ์—ด์—์„œ np.min์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๊ทธ๊ฒƒ์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. numpy ๋ฌธ์„œ๋Š” ์ด๊ฒƒ์ด ํ—ˆ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

NaN ๊ฐ’์ด ์ „ํŒŒ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ•˜๋‚˜ ์ด์ƒ์˜ ํ•ญ๋ชฉ์ด NaN์ด๋ฉด ํ•ด๋‹น ์ตœ์†Œ๊ฐ’๋„ NaN์ด๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด np.min์— ๋Œ€ํ•ด ํ—ˆ์šฉ๋˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ค‘ ํ•˜๋‚˜๋ผ๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์‚ฌ์šฉ ๊ด€์ ์—์„œ ๊ฒฝ๊ณ  / ์˜ค๋ฅ˜๊ฐ€ ์ „ํ˜€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

(์˜ˆ๋ฅผ ๋“ค์–ด np.isnan(arr).any() ์™€ ๊ฐ™์ด์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ๋ถ„๋ช…ํžˆ ์žˆ์ง€๋งŒ ์œ„์˜ ์ถ”๋ก ์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๊ธฐ์— ๊ทธ๋Ÿด๋“ฏํ•œ ๋ณ€ํ™”๋Š” ์ „ํ˜€ ์•„๋‹ˆ๋‹ค.

๊ฒฝ๊ณ ๊ฐ€ ์ „ํ˜€ ์—†์œผ๋ฉด +1

์•ˆ๋…•ํ•˜์„ธ์š”,

๋น„์Šทํ•œ ๋ถˆ์ผ์น˜๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

>>> import numpy
>>> import warnings
>>> warnings.simplefilter("always", category=RuntimeWarning)
>>> numpy.min(numpy.full((7,), numpy.nan, dtype=numpy.float64))
nan
>>> numpy.min(numpy.full((8,), numpy.nan, dtype=numpy.float64))
/home/user/env/lib/python3.6/site-packages/numpy/core/_methods.py:29: RuntimeWarning: invalid value encountered in reduce
  return umr_minimum(a, axis, None, out, keepdims)
nan

8 ๊ฐœ ์ด์ƒ์˜ ์…ฐ์ดํ”„๊ฐ€ RuntimeWarning์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@NotSqrt @seberg ์ž…๋ ฅ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ 8์— ๋„๋‹ฌ ํ•  ๋•Œ min์ด NaN์„ ์ „ํ˜€ ์ „ํŒŒํ•˜์ง€ ์•Š๋Š” ์œ ์‚ฌํ•œ ๋™์ž‘์„๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

> cat np-min-wat.py
import numpy as np

print "numpy version:", np.__version__
print ""

def show_min(input):
    print ""
    arr = np.array(input)
    print arr.dtype, arr
    print "this should be nan as per docs:", arr.min()
    arr = np.array

input = [31., 487., np.nan, 10000., 10000., 19., 101., 22., 1000., 300., 10.]
for x in xrange(3, len(input) + 1):
    show_min(input[0:x])

OSX ๋ฐ Windows์—์„œ๋Š” ๋‹ค์†Œ ์ด์ƒํ•œ ๋™์ž‘์„ ๋ณด์—ฌ ์ฃผ์ง€๋งŒ Linux๋Š” ์•„๋‹™๋‹ˆ๋‹ค. python 2.7.13 ๋ฐ numpy 1.14.2๋ฅผ ์‚ฌ์šฉํ•˜๋Š” fresh virtualenv :

numpy version: 1.14.2

/Users/kip/ac/Environments/test/lib/python2.7/site-packages/numpy/core/_methods.py:29: RuntimeWarning: invalid value encountered in reduce
  return umr_minimum(a, axis, None, out, keepdims)

float64 [ 31. 487.  nan]
this should be nan as per docs: nan

float64 [   31.   487.    nan 10000.]
this should be nan as per docs: nan

float64 [   31.   487.    nan 10000. 10000.]
this should be nan as per docs: nan

float64 [   31.   487.    nan 10000. 10000.    19.]
this should be nan as per docs: nan

float64 [   31.   487.    nan 10000. 10000.    19.   101.]
this should be nan as per docs: nan

float64 [   31.   487.    nan 10000. 10000.    19.   101.    22.]
this should be nan as per docs: 19.0

float64 [   31.   487.    nan 10000. 10000.    19.   101.    22.  1000.]
this should be nan as per docs: 19.0

float64 [   31.   487.    nan 10000. 10000.    19.   101.    22.  1000.   300.]
this should be nan as per docs: nan

float64 [   31.   487.    nan 10000. 10000.    19.   101.    22.  1000.   300.
    10.]
this should be nan as per docs: nan

๋‘ ๊ฐœ์˜ "this should be nan as per docs : 19.0 "์ค„์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ ๊ฒฝ๊ณ ๋Š” numpy 1.13.1์— ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์ด ๋™์ž‘์„ ์ฒ˜์Œ ๊ด€์ฐฐ ํ•œ ๊ณณ์ž…๋‹ˆ๋‹ค.)

@kippr NumPy๋ฅผ ์–ด๋””์„œ ์–ป์—ˆ์Šต๋‹ˆ๊นŒ?

8 ๊ฐœ์˜ ์š”์†Œ ๊ฒฝ๊ณ„๊ฐ€ AVX512์™€ ๊ด€๋ จ์ด์žˆ์„ ์ˆ˜ ์žˆ๊ณ  ๋ฌธ์ œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์™€ CPU์˜ ์กฐํ•ฉ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค CPU / ์ปดํŒŒ์ผ๋Ÿฌ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@juliantaylor ์ƒ๊ฐ?

์ •๋ ฌ๋„ ํšจ๊ณผ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @charris

์งˆ๋ฌธ์— ๋‹ตํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด ๊ฒŒ์‹œ๋ฌผ์„ ์ฝ์–ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

CPU :
โƒ sysctl -n machdep.cpu.brand_string Intel (R) Core (TM) i7-6700K CPU @ 4.00GHz

NumPy ๋Š” Mac์˜ ์ƒˆ๋กœ์šด virtualenv (homebrew๋ฅผ ํ†ตํ•ด ์„ค์น˜๋œ Python 2.7.13)์—์„œ pip๋ฅผ ํ†ตํ•ด ์„ค์น˜๋˜์—ˆ์œผ๋ฏ€๋กœ ๋ชจ๋“  ๊ธฐ๋ณธ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ ๋“ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

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

[..]
 Downloading numpy-1.14.2.zip (4.9MB):                                                                                                                                                                                                                                            
  Downloading from URL https://pypi.python.org/packages/0b/66/86185402ee2d55865c675c06a5cfef742e39f4635a4ce1b1aefd20711c13/numpy-1.14.2.zip#md5=080f01a19707cf467393e426382c7619 (from https://pypi.python.org/simple/numpy/)                                                      
...Downloading numpy-1.14.2.zip (4.9MB): 4.9MB downloaded              
[..]
    building library "npymath" sources
    get_default_fcompiler: matching types: '['gnu95', 'nag', 'absoft', 'ibm', 'intel', 'gnu', 'g95', 'pg']'
    customize Gnu95FCompiler
    Found executable /usr/local/bin/gfortran
    customize Gnu95FCompiler
    customize Gnu95FCompiler using config
    C compiler: clang -fno-strict-aliasing -fno-common -dynamic -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes

    compile options: '-Inumpy/core/src/private -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c'
    clang: _configtest.c
    clang _configtest.o -o _configtest
    success!
    removing: _configtest.c _configtest.o _configtest

๊ฐ์‚ฌ
ํฌ๋ฆฌ์Šค

build.log

์ถ”์‹ ์€ ์•„๋งˆ ๋†€๋ผ์šด ์ผ์ด ์•„๋‹ˆ์ง€๋งŒ max์™€ ๋™์ผํ•œ ๋™์ž‘์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

numpy version: 1.14.2


arr.dtype, arr: float64 [ 31. 487.  nan]
/Users/kip/ac/Environments/meh/lib/python2.7/site-packages/numpy/core/_methods.py:29: RuntimeWarning: invalid value encountered in reduce
  return umr_minimum(a, axis, None, out, keepdims)
arr.min(): nan
/Users/kip/ac/Environments/meh/lib/python2.7/site-packages/numpy/core/_methods.py:26: RuntimeWarning: invalid value encountered in reduce
  return umr_maximum(a, axis, None, out, keepdims)
arr.max(): nan
np.amin(arr): nan
np.nanmin(arr): 31.0

arr.dtype, arr: float64 [   31.   487.    nan 10000.]
arr.min(): nan
arr.max(): nan
np.amin(arr): nan
np.nanmin(arr): 31.0

arr.dtype, arr: float64 [   31.   487.    nan 10000. 10000.]
arr.min(): nan
arr.max(): nan
np.amin(arr): nan
np.nanmin(arr): 31.0

arr.dtype, arr: float64 [   31.   487.    nan 10000. 10000.    19.]
arr.min(): nan
arr.max(): nan
np.amin(arr): nan
np.nanmin(arr): 19.0

arr.dtype, arr: float64 [   31.   487.    nan 10000. 10000.    19.   101.]
arr.min(): nan
arr.max(): nan
np.amin(arr): nan
np.nanmin(arr): 19.0

arr.dtype, arr: float64 [   31.   487.    nan 10000. 10000.    19.   101.    22.]
arr.min(): 19.0
arr.max(): 10000.0
np.amin(arr): 19.0
np.nanmin(arr): 19.0

arr.dtype, arr: float64 [   31.   487.    nan 10000. 10000.    19.   101.    22.  1000.]
arr.min(): 19.0
arr.max(): 10000.0
np.amin(arr): 19.0
np.nanmin(arr): 19.0

arr.dtype, arr: float64 [   31.   487.    nan 10000. 10000.    19.   101.    22.  1000.   300.]
arr.min(): nan
arr.max(): nan
np.amin(arr): nan
np.nanmin(arr): 19.0

arr.dtype, arr: float64 [   31.   487.    nan 10000. 10000.    19.   101.    22.  1000.   300.
    10.]
arr.min(): nan
arr.max(): nan
np.amin(arr): nan
np.nanmin(arr): 10.0

AVX2 ๋ฐ sse4.2 ๊ธฐ๋Šฅ์ด์žˆ๋Š” CPU์—์„œ ๋™์ผํ•œ numpy ๋ฒ„์ „ (์•„์น˜์—์„œ)์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ Linux์—์„œ๋Š” ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ทธ๊ฒƒ์€ mac / clang๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

ํŽธ์ง‘ / ์ˆ˜์ • : (๋‚˜๋Š” ๋‹ค๋ฅธ ์ •๋ ฌ์„ ์œ ๋ฐœํ•˜๋ฉด์„œ ์•ฝ๊ฐ„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๊ฒฝ๊ณ  ๋ถ€๋ถ„์„ ํ™•์ธํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๋ณด์ง€ ๋ชปํ•˜๋Š” ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ ๋ถ€๋ถ„)

์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜์ง€ ์•Š์€ CPU ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ๊ณ  ์•„๋งˆ๋„ ์ปดํŒŒ์ผ๋Ÿฌ์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ์ถ”์  ํ•  ์ˆ˜์žˆ๋Š” ํ…Œ์ŠคํŠธ๋ฅผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. @kippr ๋ฌด์—‡์„

np.min(np.diagflat([np.nan]*10), axis=0)

์„ค์น˜์— ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š” @charris

๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

In [1]: import numpy as np

In [2]: np.min(np.diagflat([np.nan]*10), axis=0)
Out[2]: array([ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan])

๊ทธ๋Ÿฌ๋‚˜ ๋ช‡ ๊ฐ€์ง€ ์ฝค๋ณด๋ฅผ ๋” ์‹œ๋„ํ•˜๊ณ  ๋‹ค์Œ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค (๋งˆ์ง€๋ง‰ ๊ฐ’, 8 ๊ฐœ ๊ฐ’ ๋ฐ ์ถ• = 1 ์ฐธ์กฐ).

In [3]: np.min(np.diagflat([np.nan]*10), axis=1)
Out[3]: array([ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan])

In [4]: np.min(np.diagflat([np.nan]*8), axis=0)
Out[4]: array([ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan])

In [5]: np.min(np.diagflat([np.nan]*8), axis=1)
Out[5]: array([ nan,  nan,   0.,   0.,  nan,   0.,  nan,  nan])

๊ทธ๊ฒŒ ์›์ธ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@seberg-๋งž์Šต๋‹ˆ๋‹ค. Mac๊ณผ Windows์—์„œ๋„์ด ๋™์ž‘์„ ๊ด€์ฐฐํ–ˆ์ง€๋งŒ Linux๋Š” ๊ดœ์ฐฎ

๊ฐ์‚ฌ
ํฌ๋ฆฌ์Šค

@kippr ์ด๊ฒƒ์€ ๊ธฐ๋ณธ ์ž‘์—…์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ  ๋ฌธ์ œ๊ฐ€ NumPy์—์„œ ๋น„๋กฏ๋œ ๊ฒƒ ๊ฐ™์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ง ๋ฐฉํ•ด๊ฐ€๋˜๋Š” ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค. MAC ๋ฐ Windows์—์„œ ๋ฒกํ„ฐํ™”๋ฅผ ๋„๊ณ  ๋„์›€์ด๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” Python 2.7์—์„œ๋งŒ ๋ณด์ž…๋‹ˆ๊นŒ?

1.14์—์„œ์ด ๋™์ž‘์„ ๋ณ€๊ฒฝ ํ•œ NumPy์˜ ์–ด๋–ค ๊ฒƒ๋„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ OpenBLAS๊ฐ€ ์ปจํŠธ๋กค์„ ์กฐ์ž‘ํ•˜๊ณ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค ...

ํŠธ์œ— ๋‹ด์•„ ๊ฐ€๊ธฐ

์•ˆ๋…•ํ•˜์„ธ์š” @charris

Mac์˜ python 3์—์„œ๋„์ด ๋™์ž‘์ด ๋ณด์ž…๋‹ˆ๋‹ค.

Python 3.6.0 (default, Jan 23 2017, 20:09:28)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np

>>> np.min(np.diagflat([np.nan]*8), axis=1)
array([nan, nan,  0.,  0., nan,  0., nan, nan])
>>> np.__version__
'1.14.2'

Nb ์ €๋Š” Mac์˜ python 2.7์—์„œ NumPy ๋ฒ„์ „ 1.13์—์„œ์ด ๋™์ž‘์„ ์ฒ˜์Œ ๋ฐœ๊ฒฌ ํ–ˆ์œผ๋ฏ€๋กœ 1.14์— ๋„์ž… ๋œ ํšŒ๊ท€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

Python 2.7.10 (default, Feb  7 2017, 00:08:15)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> np.min(np.diagflat([np.nan]*8), axis=1)
array([ nan,  nan,   0.,   0.,  nan,   0.,  nan,  nan])
>>> np.__version__
'1.13.1'

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์„ cygwin / windows์—์„œ ์žฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

$ python
Python 2.7.13 (default, Mar 13 2017, 20:56:15)
[GCC 5.4.0] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> np.min(np.diagflat([np.nan]*8), axis=1)
array([ nan,  nan,   0.,   0.,  nan,   0.,  nan,  nan])
>>> np.__version__
'1.13.1'

๊ทธ๋Ÿฌ๋‚˜ Linux์—์„œ๋Š”์ด ๋ฌธ์ œ๋ฅผ ๋ณด์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

Python 2.7.6 (default, Oct 26 2016, 20:32:47) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> np.min(np.diagflat([np.nan]*8), axis=1)
array([ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan])
>>> np.__version__
'1.13.1'

@charris openblas ๋ฐ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๊ฐ€ numpy / scipy์˜ ๋™์ž‘์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜์žˆ๋Š” numpy์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ๋Œ€ํ•œ ์—ฌ์ •์—์„œ ๋ณด์•˜์Šต๋‹ˆ๋‹ค (๋‚ด ๊ฒฝํ—˜์— ๋”ฐ๋ผ). ์šฐ๋ฆฌ๊ฐ€ ์ทจํ•  ์ˆ˜์žˆ๋Š” ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š”์ด๋ฅผ C (openblas ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ) ํ…Œ์ŠคํŠธ์— ์ ์šฉํ•˜์—ฌ ๋™์ž‘์„ ๋ถ„๋ฆฌํ•˜๊ณ  ๋ณต์ œ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๊ฒƒ์ด MAC ๋ฐ Windows์— ์žˆ๋Š”์ง€ ๋‹ค์‹œ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋งž์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋ฆฌ๋ˆ…์Šค์—์„œ์ด ๋™์ž‘์„ ๋ณผ ์ˆ˜ ์—†๋‹ค (vx ํŒจ์น˜๋Š” 1.15 ์šฉ์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฏ€๋กœ ์ด๊ฒƒ์— ์˜ํ–ฅ์„์ฃผ์ง€ ์•Š์•„์•ผํ•œ๋‹ค). @kippr Mac / windows์—์„œ numpy๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๊นŒ? ๋ฌธ์•ˆ ์ธ์‚ฌ

์•ˆ๋…•ํ•˜์„ธ์š” @VictorRodriguez

์ด๊ฒƒ์€ Mac์˜ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด virtualenv ์ธ ๋‘ ํ”Œ๋žซํผ์—์„œ pip ์„ค์น˜๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค. python 2.7 ์„ค์น˜์— ๋Œ€ํ•œ ์ปดํŒŒ์ผ ์ถœ๋ ฅ์„ ํฌํ•จํ•˜์—ฌ pip์— ๋Œ€ํ•œ ๋กœ๊ทธ๋ฅผ ๋ถ™์—ฌ ๋„ฃ์€ ์œ„๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. (Python 3 pip ์„ค์น˜๋Š” ๋ฐ”ํ€ด์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.)

๊ฑด๋ฐฐ ํฌ๋ฆฌ์Šค

์•ˆ๋…• ์—ฌ๋Ÿฌ๋ถ„
๋„์›€์„ ๋“œ๋ฆด ์ˆ˜์žˆ๋Š” ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ์‚ฌ

Mac (๋ฐ ๊ธฐํƒ€ ํ”Œ๋žซํผ)์—์„œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ (Mac์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ gcc๊ฐ€ ์•„๋‹Œ clang / llvm ์ž„)๊ฐ€ ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ SSE2 ๋ช…๋ น์„ ์žฌ์ •๋ ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„๊ทธ :

np.min(np.diagflat([np.nan]*8), axis=1)

์‹คํ–‰์ค‘์ธ ์ฝ”๋“œ๊ฐ€ ๋‹ค์Œ์—์„œ ์ƒ์„ฑ ๋œ sse2_minimum_DOUBLE์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
https://github.com/numpy/numpy/blob/d7d5cb3feccc1fc6cf57159e8b9fe0a733968706/numpy/core/src/umath/simd.inc.src#L1020

ํŠนํžˆ 1041 ํ–‰์˜ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์ด ์ฝ”๋“œ (SSE2 ์–‘์‹์„ ์ž๋™ ํ™•์žฅํ–ˆ์Šต๋‹ˆ๋‹ค)๋ฅผ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

        }
        c1 = _mm_min_pd(c1, c2);

        if (npy_get_floatstatus() & NPY_FPE_INVALID) {
            *op = NPY_NAN;
        }
        else {
            npy_double tmp = sse2_horizontal_min___m128d(c1);
            ....
         }

์ปดํŒŒ์ผ๋Ÿฌ๋Š” c1 ํ• ๋‹น๊ณผ npy_get_floatstatus ()๊ฐ€ ๊ด€๋ จ๋˜์–ด ์žˆ์Œ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

        }
        if (npy_get_floatstatus() & NPY_FPE_INVALID) {
            *op = NPY_NAN;
        }
        else {
            c1 = _mm_min_pd(c1, c2);
            npy_double tmp = sse2_horizontal_min___m128d(c1);
            ....
         }

๋‹น์—ฐํžˆ ๋ง๋„ ์•ˆ๋˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ์ตœ์ ํ™”์—์„œ ์ด๊ฒƒ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋„๋ก ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. (๋‹ค๋ฅธ ํ”Œ๋žซํผ์—๋Š” ์ด๊ฒƒ์„ ์œ„ํ•ด STDC FENV_ACCESS pragma๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?)

์ด ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ 5 ๋…„์ด ์ง€๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„๊ทธ์˜ ์›์ธ์€ ์ƒˆ ๋ฒ„์ „์˜ clang ๋ฐ ๋‹ค๋ฅธ ์ตœ์ ํ™” ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @tzickel

๋ช‡ ๋‹ฌ ์ „์— ๊ณ ๋“ฑํ•™๊ต ๋•Œ๋ถ€ํ„ฐ C๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํ˜„๋ช…ํ•œ ๋ฐฉ๋ฒ•์„ ํ™•์‹คํžˆ ์•Œ์•„๋‚ผ ์ˆ˜๋Š” ์—†์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์›๋ž˜ ์ˆœ์„œ๋Œ€๋กœ ํ‰๊ฐ€ํ•˜๋„๋ก ๋ช‡ ๊ฐ€์ง€ ์‹œ๋„๋ฅผํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ if ๋ฌธ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

if ((sizeof(c1) != 0) || (sizeof(c1) == 0) & npy_get_floatstatus() & NPY_FPE_INVALID) {

๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋ฒ„๊ทธ๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

(๋‚˜๋Š” ๋˜ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ if ๋ฌธ๋ณด๋‹ค ๋จผ์ € _mm_min_pd๋ฅผ ํ‰๊ฐ€ํ•˜๋„๋กํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋œ ๋ฉ์ฒญํ•œ ํ˜•์‹์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด if ๋ฌธ ์–‘์ชฝ์— c1์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ  if / else ๋ธ”๋ก ๋’ค์— ๋ชจ๋‘ ์•„๋ฌด ์†Œ์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ–ˆ์ง€๋งŒ ํ•ญ์ƒ c = _mm_min_pd ํ• ๋‹น์„ ์‹คํ–‰ํ–ˆ๊ฑฐ๋‚˜ ๋‚ด ํ˜ธ์ถœ์ด ์‹ค์ œ๋กœ ํ•œ ํ˜•์‹ ๋˜๋Š” ๋‹ค๋ฅธ ํ˜•์‹์˜ noops๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.)

๊ทธ๋Ÿฌ๋‚˜ ์–ด์จŒ๋“  ๋‚ด๊ฐ€๋ณด๊ณ ์žˆ๋Š” ๋ฒ„๊ทธ๋ฅผ ์‹๋ณ„ํ–ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ _mm_min_pd ๋ฐ npy_get_floatstatus์˜ ์ˆœ์„œ๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘๋„๋ก ํžŒํŠธ ํ•  ์ˆ˜์žˆ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ข‹์Šต๋‹ˆ๋‹ค. Google์ด ์ œ์•ˆํ•œ ๋˜ ๋‹ค๋ฅธ ํ•œ ๊ฐ€์ง€ : c1 ํœ˜๋ฐœ์„ฑ ํ‘œ์‹œ :

https://github.com/numpy/numpy/blob/d7d5cb3feccc1fc6cf57159e8b9fe0a733968706/numpy/core/src/umath/simd.inc.src#L1029

๋ฉ๋‹ˆ๋‹ค :

        /* load the first elements */
        @vtype@ volatile c1 = @vpre@_load_@vsuf@((@type@*)&ip[i]);
        @vtype@ c2 = @vpre@_load_@vsuf@((@type@*)&ip[i + stride]);
        i += 2 * stride;

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ธ์ง€ ์—ฌ๋ถ€์™€ ๊ด€๋ จํ•˜์—ฌ ์–ด๋–ค ์˜๋ฏธ์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด @tzickel ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋””๋ฒ„๊ทธ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ๊นŠ์€ ๋””๋ฒ„๊ทธ ์˜€์Šต๋‹ˆ๋‹ค . ๋˜ํ•œ gcc๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Linux ์‹œ์Šคํ…œ์—์„œ ์‹คํ–‰ ํ•œ ๊ฒฝ์šฐ :

$ ํŒŒ์ด์ฌ
Python 3.6.5 (๊ธฐ๋ณธ๊ฐ’, 2018 ๋…„ 4 ์›” 1 ์ผ, 15:40:54)
Linux์˜ [GCC 7.3.0]
์ž์„ธํ•œ ๋‚ด์šฉ์„ ๋ณด๋ ค๋ฉด "help", "copyright", "credits"๋˜๋Š” "license"๋ฅผ ์ž…๋ ฅํ•˜์‹ญ์‹œ์˜ค.

numpy๋ฅผ np๋กœ ๊ฐ€์ ธ ์˜ค๊ธฐ
np.version.version
'1.14.2'
np.min ([1., 2., 3., 4., np.nan])
๋‚œ
np.min ([1., 2., 3., np.nan, 4.])
๋‚œ
np.min ([1., 2., np.nan, 3., 4.])
๋‚œ
np.min ([1., np.nan, 2., 3., 4.])
๋‚œ
np.min ([np.nan, 1., 2., 3., 4.])
๋‚œ
np.min ([np.nan, 1.])
๋‚œ
np.min ([np.nan, 1., np.nan])
๋‚œ
np.min ([1., np.nan])
๋‚œ
np.seterr (all = 'raise')
{ 'divide': 'warn', 'over': 'warn', 'under': 'ignore', 'invalid': 'warn'}
np.min ([np.nan, 1.0])
๋‚œ

๊ฒฝ๊ณ ๊ฐ€ ์ „ํ˜€ ํ‘œ์‹œ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์„ค๋ช…ํ•œ๋Œ€๋กœ ๋ฌธ์ œ๊ฐ€ clang์—์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋ฅผ ๊ถ๊ธˆํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ pip install numpy์œผ๋กœ ์ด๊ฒƒ์„ ๋ณด๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด ์กŒ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ํ”Œ๋ž˜๊ทธ๊ฐ€ ์‚ฌ์šฉ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ ๋‚ด Mac์— ์˜ค๋ฅ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

https://hastebin.com/cuzinajero.swift

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ๋” ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

if (c1 = n_mm_min_pd(c1, c2), py_get_floatstatus() & NPY_FPE_INVALID) {

@juliantaylor ์ƒ๊ฐ?

๋˜๋Š”

return_nan = (c1 = n_mm_min_pd(c1, c2), py_get_floatstatus() & NPY_FPE_INVALID);
if (return_nan) {

์‰ผํ‘œ ์—ฐ์‚ฐ์ž๋Š” ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์‹œํ€€์Šค ์ง€์ ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ , simd ์ฝ”๋“œ ์—์„œ ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์–ผ๋งˆ๋‚˜ ์•ˆ์ „ํ•œ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

@VictorRodriguez python2.7์„ ์‚ฌ์šฉํ•˜์—ฌ Mac์—์„œ pip install numpy๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์†Œ์Šค์—์„œ ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค. python3์œผ๋กœ pip install์„ ์‹คํ–‰ํ•˜๋ฉด ํœ ์—์„œ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

pip install์˜ ์ „์ฒด ์ถœ๋ ฅ์„ ์บก์ฒ˜ํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/numpy/numpy/files/1912086/build.log

์œ„์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ์†Œ์Šค (ํ˜„์žฌ ๋งˆ์Šคํ„ฐ)์—์„œ ๋นŒ๋“œํ–ˆ์ง€๋งŒ ์กฐ์ •ํ•˜์ง€ ์•Š์•„๋„ ์—ฌ์ „ํžˆ ๊นจ์ง„ ๋™์ž‘์ด ๋ณด์ด๋Š”์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ ํ•  ๋•Œ INSTALL.rst.txt์— ์ œ์•ˆ ๋œ ๋ช…๋ น ์ค„์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
python setup.py build -j 4 install --prefix $HOME/.local

ํ•œ๋งˆ๋””๋กœ, ์—ฌ๊ธฐ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ฐฝ๋ฌธ์—์„œ๋„ ๋ฒŒ๋ ˆ๋ฅผ ๋ณด์•˜๋‹ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด Windows์—์„œ clang์œผ๋กœ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ง€๋งŒ MSVC ๋˜๋Š” GCC๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด numpy๊ฐ€ ํ”Œ๋žซํผ์˜ ๊ทœ์น™์„ ์ค€์ˆ˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Windows์—์„œ numpy๋Š” fp ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ ์˜ค๊ธฐ ์œ„ํ•ด _statusfp๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ MSDN ์„ค๋ช…์„œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŽ์€ ์ˆ˜ํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋Š” ์˜ˆ์ธกํ•  ์ˆ˜์—†๋Š” ๊ฒฐ๊ณผ๋กœ ๋ถ€๋™ ์†Œ์ˆ˜์  ์ƒํƒœ ์–ด๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ ํ™”๋Š” _status87, _statusfp ๋ฐ ๊ด€๋ จ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํ˜ธ์ถœ๊ณผ ๊ด€๋ จ๋œ ๋ถ€๋™ ์†Œ์ˆ˜์  ์—ฐ์‚ฐ์„ ์žฌ์ •๋ ฌ, ๊ฒฐํ•ฉ ๋ฐ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. / Od (๋น„ํ™œ์„ฑํ™” (๋””๋ฒ„๊ทธ)) ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜ ๋˜๋Š” fenv_access pragma ์ง€์‹œ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€๋™ ์†Œ์ˆ˜์  ์—ฐ์‚ฐ์„ ์žฌ์ •๋ ฌํ•˜๋Š” ์ตœ์ ํ™”๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

GCC ๋ฐ MSVC (ํ˜„์žฌ clang์€ ์•„๋‹˜)์—๋Š”์ด๋ฅผ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹pragma๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@tzickel ์€ Windows ๋นŒ๋“œ๊ฐ€ cygwin๊ณผ ํ•จ๊ป˜ ์žˆ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. MSVC๋กœ ๋‚˜๋ฅผ ์œ„ํ•ด ์žฌํ˜„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ „๋ฐ˜์ ์œผ๋กœ @charris ์˜ ์ œ์•ˆ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€ C์ด๋ฉฐ pragma๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ AFAICT๋Š” ์˜ค๋ฒ„ ํ—ค๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

/* use the comma operator to prevent optimization changing the order of evaluation */
if (c1 = n_mm_min_pd(c1, c2), py_get_floatstatus() & NPY_FPE_INVALID) {

ํŒŒ์ด์ฌ 2.7์— ์‚ฌ์šฉ๋˜๋Š” Visual Studio 8 ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ๋„ ์ง€์›๋ฉ๋‹ˆ๋‹ค.
๋‘ ๋ฒˆ์งธ, ๋” ๊ฐ„๊ฒฐํ•œ ์ œ์•ˆ์€ ๋„ˆ๋ฌด ๋‚œ๋… ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์ด ๋ฒ„๊ทธ์— ์ทจ์•ฝํ•œ ์ฝ”๋“œ์— ๋‹ค๋ฅธ ์œ„์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

  1. cygwin ๋นŒ๋“œ์— GCC๊ฐ€ ๋‚˜์™€ ์žˆ๋Š”๋ฐ, ์ด๋Š” ๋ฒ„๊ทธ๊ฐ€ Linux์ฒ˜๋Ÿผ ์ž‘๋™ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  2. ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๋ฉด ์‰ผํ‘œ ์—ฐ์‚ฐ์ž๋Š” ์ตœ์ ํ™”์— ๋„์›€์ด๋˜์ง€ ์•Š์œผ๋ฉฐ ๋‹ค๋ฅธ ์ˆ˜์ค€์˜ ์ฝ”๋“œ ์ƒ์„ฑ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์—ฌ์ „ํžˆ ๋‘ ํ‘œํ˜„์‹์ด ์„œ๋กœ ๊ด€๋ จ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ด๊ฒƒ์ด ์‚ฌ๋ก€์ž„์„ ๋ณด์—ฌ์ฃผ๋Š” ์ž‘์€ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค (์˜†์—์žˆ๋Š” ์ค„๋กœ ์ฃผ์„ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด๋ณด์‹ญ์‹œ์˜ค). GCC ๋ฐ CLANG (GCC ํŠธ๋ ํฌ์—๋Š” ํ˜„์žฌ ๋™์ผํ•œ ๋ฒ„๊ทธ๊ฐ€์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค :)) :

https://godbolt.org/g/Zoc5xr

  1. fenv.h๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ด๋‹น ํŒŒ์ผ์— ์•ก์„ธ์Šคํ•˜๋Š” ์ฝ”๋“œ์˜ ๋ชจ๋“  ํ•จ์ˆ˜๋Š” ๋™์ผํ•œ ๋ฌธ์ œ ๊ฐ€๋Šฅ์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ numpy / core / src / npymath / ieee754.c์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ์—์„œ ํ˜ธ์ถœ๋˜๋Š” ๋ชจ๋“  ๊ฒƒ

  2. ์ œ ์ƒ๊ฐ์—๋Š” clang์€ ํ˜„์žฌ ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    A. gcc (์ตœ์†Œํ•œ ๊ณต์‹์ ์ธ mac wheel)๋กœ ์ปดํŒŒ์ผํ•˜๊ณ  clang์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋ฉด ๊ฒฝ๊ณ ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    B. Clang์€ ํ•จ์ˆ˜๋ณ„๋กœ optnone ์†์„ฑ์„ ์ง€์›ํ•˜๋ฉฐ, clang์œผ๋กœ ์ปดํŒŒ์ผ ํ•  ๊ฒฝ์šฐ ๋ชจ๋“  ์ตœ์ ํ™” (๋Š๋ฆฌ์ง€ ๋งŒ ์˜ฌ๋ฐ”๋ฅธ ์ฝ”๋“œ)๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜์— ๋ฟŒ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    https://clang.llvm.org/docs/AttributeReference.html#optnone -clang-optnone-clang-optnone

์‰ผํ‘œ ์—ฐ์‚ฐ์ž๋กœ ์ „ํ™˜ํ•ด๋„ ์ „ํ˜€ ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ; ์€ (๋Š”) ์ด๋ฏธ ์‹œํ€€์Šค ํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค.

@ eric-wieser ํ™•์‹คํ•ฉ๋‹ˆ๊นŒ? ; ์ด (๊ฐ€) ์‹œํ€€์Šค ํฌ์ธํŠธ๋กœ ๋‚˜์—ด๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. https://msdn.microsoft.com/en-us/library/azk8zbxd.aspx

์–ด์จŒ๋“  ์‰ผํ‘œ ์—ฐ์‚ฐ์ž์˜ ์ธ์ˆ˜๊ฐ€ ํ‰๊ฐ€๋˜๋Š” ์ˆœ์„œ๋Š” ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ; ๊ตฌ๋ถ„ ๋œ ๋ฌธ์ด์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

@charris ์•ˆํƒ€๊น๊ฒŒ๋„ ์ œ์•ˆ ๋œ ๋ณ€๊ฒฝ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

diff --git a/numpy/core/src/umath/simd.inc.src b/numpy/core/src/umath/simd.inc.src
index 2241414ac..8345e3ef7 100644
--- a/numpy/core/src/umath/simd.inc.src
+++ b/numpy/core/src/umath/simd.inc.src
@@ -1038,9 +1038,8 @@ sse2_@kind@_@TYPE@(@type@ * ip, @type@ * op, const npy_intp n)
             c1 = @vpre@_@VOP@_@vsuf@(c1, v1);
             c2 = @vpre@_@VOP@_@vsuf@(c2, v2);
         }
-        c1 = @vpre@_@VOP@_@vsuf@(c1, c2);

-        if (npy_get_floatstatus() & NPY_FPE_INVALID) {
+        if (c1 = @vpre@_@VOP@_@vsuf@(c1, c2), npy_get_floatstatus() & NPY_FPE_INVALID) {
             *op = @nan@;
         }
         else {

๋ณ€์ˆ˜๋ฅผ ํœ˜๋ฐœ์„ฑ์œผ๋กœ ํ‘œ์‹œํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ณ€ํ˜•์„ ์‹œ๋„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์‰ผํ‘œ ์—ฐ์‚ฐ์ž์— ๊ด€ํ•œ ์‚ฌ์–‘์„ ์ค€์ˆ˜ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ ์–ด๋„ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์–‘์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์ปดํŒŒ์ผ๋Ÿฌ ์ƒํƒœ์— ๋Œ€ํ•œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ์ฑ…์€ ๋ถ€์„œ์ง€๊ธฐ ์‰ฌ์šด ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ volatile ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„, GCC 8.1์ด ๋ฐฉ๊ธˆ ์ถœ์‹œ๋˜์—ˆ๊ณ  ๋ฌด์—‡์„ ์ถ”์ธกํ•˜์‹ญ์‹œ์˜ค ... ์ตœ์ ํ™”๊ฐ€ ์ ์šฉ๋œ GCC๋Š” ์ด์ œ clang์ด ์—ฌ๊ธฐ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค https://github.com/numpy/numpy/issues/10370#issuecomment -384154230 (์‰ผํ‘œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ์ƒ๋Œ€๋กœ ๊ฑฐ๊ธฐ์— ๋„์›€์ด๋˜์ง€๋งŒ ํœ˜๋ฐœ์„ฑ์€ํ•ฉ๋‹ˆ๋‹ค), distutils๊ฐ€ ์ด๊ฒƒ์„ ์™„ํ™”ํ•˜๋Š” gcc ํ”Œ๋ž˜๊ทธ์—์„œ ํ™œ์„ฑํ™”ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ GCC 8.1์˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค (๊ดœ์ฐฎ์€ 7.3๊ณผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).
https://godbolt.org/g/AJRdRQ

asm์—์„œ minpd ๋ฐ npy_get_floatstatus ํ˜ธ์ถœ์„ ๊ฒ€์ƒ‰ํ•˜์‹ญ์‹œ์˜ค.

๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด์•ผํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ์™€ ํ•จ๊ป˜ ์ž ์‹œ ํœ˜๋ฐœ์„ฑ์„ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์‚ดํŽด๋ณผ ์ˆ˜์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ ํœ˜๋ฐœ์„ฑ ๋˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์ง€์‹œ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๋„๋ก ํ•œ ๊ณณ์— ๋‘˜ ์ˆ˜์žˆ๋Š” ๋ณ„๋„์˜ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํŠน์ • ๋ฌธ์ œ๋ณด๋‹ค ํ›จ์”ฌ ๋” ํฐ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ieee754.c์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ชจ๋“  numpy ์ฝ”๋“œ๋Š” ๊ฐ์‚ฌ ๋ฐ ์ˆ˜์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. (์•„๋งˆ๋„์ด โ€‹โ€‹์ด์Šˆ์˜ ์ด๋ฆ„์„ ๋‹ค์‹œ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์€ ์ƒˆ๋กœ์šด ์ด์Šˆ๋ฅผ ์—ฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค).

minpd ๋ช…๋ น์–ด์˜ ๋†€๋ผ์šด ๋™์ž‘์€ https://github.com/numpy/numpy/issues/10370#issuecomment -381241813๊ณผ ๊ด€๋ จ์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ช…๋ น์–ด์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ NaN (SNaN ๋˜๋Š” QNaN)์ด๋ฉด ๋‘ ๋ฒˆ์งธ ํ”ผ์—ฐ์‚ฐ์ž (์†Œ์Šค ํ”ผ์—ฐ์‚ฐ์ž) (NaN ๋˜๋Š” ์œ ํšจํ•œ ๋ถ€๋™ ์†Œ์ˆ˜์  ๊ฐ’)๊ฐ€ ๊ฒฐ๊ณผ์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

์ฐธ์กฐ : http://www.felixcloutier.com/x86/MINPD.html

@mattkretz ๋Š” ๊ทธ๋ ‡๊ฒŒ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (๊ทธ๊ฒƒ์ด ์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์ด๋ฉฐ์ด ๊ฒ€์‚ฌ๊ฐ€ ์ด๋ฏธ ์‹œํ–‰ ๋œ ์ด์œ ์ž…๋‹ˆ๋‹ค).

@tzickel ๊ถ๊ธˆํ•ด์„œ ์–ด๋–ค ์ˆ˜์ค€์˜ ์ตœ์ ํ™”์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ ์ž์‹ ์„ -O2 ๋กœ ์ œํ•œํ–ˆ์ง€๋งŒ ์ผ๋ถ€ ํ”Œ๋žซํผ์€ -O3 ๋˜๋Š” ์ด์™€ ๋™๋“ฑํ•œ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด gcc ๋ฒ„๊ทธ์™€ ๋น„์Šทํ•˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค : https://gcc.gnu.org/bugzilla/show_bug.cgi?id=6065

#pragma STDC FENV_ACCESS ON ์ด ์˜ฌ๋ฐ”๋ฅธ ํ•ด๊ฒฐ์ฑ… ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Python 2.7์„ ์‚ญ์ œํ•ด์•ผํ•˜๋Š” C99๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ GCC --std=c90 ๋ชจ๋“œ๋Š” pragma๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ์งˆ๋ฌธ์€ ์—ฌ๊ธฐ ๋งํฌ๋กœ ์ด๋™ํ•˜์‹ญ์‹œ์˜ค.

https://godbolt.org/g/AJRdRQ (* ๊ณต์œ  ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ ์ž…๋ ฅ์„ ์ƒˆ ์ฐฝ์— ๋ณต์‚ฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค)

์ปดํŒŒ์ผ๋Ÿฌ ๋ฒ„์ „, ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ ๋ฐ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ฆ‰์„์—์„œ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์€ ๋‘ ์ตœ์‹  ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ -O1์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. #pragma๋Š” ์•„๋ฌด๊ฒƒ๋„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ....

์ด ๋ฒ„์ „์€ ๋งค์šฐ ๋ณต์žกํ•˜๊ณ  ์–ด์…ˆ๋ธ”๋Ÿฌ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์œผ๋ฉฐ ์–ด์…ˆ๋ธ”๋Ÿฌ๋ฅผ c ์ฝ”๋“œ์— ์—ฐ๊ฒฐํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์›๋ž˜ ๋ฒ„์ „์€ ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ–ˆ๊ณ  ๋ฌธ์ œ๋„ ์‹œ์—ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

PR ์ฐธ์กฐ

ํ  .... ๋ˆ„๊ตฌ๋“ ์ง€ numpy-1.14.3-cp27-cp27mu-manylinux1_x86_64.whl (pypi ์•„์นด์ด๋ธŒ์—์„œ) ์ปดํŒŒ์ผ ๋œ OS / ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋งํ•ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์—ฌ๊ธฐ์— ๋˜ ๋‹ค๋ฅธ (๊ด€๋ จ) ๋ฌธ์ œ๊ฐ€ ์ˆจ์–ด์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@tzickel ๊ธฐ๋ณธ ์šฐ๋ถ„ํˆฌ ์‹ ๋ขฐํ•  ์ˆ˜์žˆ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ gcc 4.8์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ์ตœ์‹  ๋ฒ„์ „์ด ์„ค์น˜๋˜์–ด์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@charris manylinux ์ปจํ…Œ์ด๋„ˆ๋Š” gcc 4.2๊ฐ€ ์„ค์น˜๋œ Centos5๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

@ngoldbaum ์ •๋ณด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ณง Python 3.7 ์šฉ ํœ ์„ ๋นŒ๋“œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. travis.yml ๋นŒ๋“œ ๋งคํŠธ๋ฆญ์Šค์— MB_PYTHON_VERSION=3.7 ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋งŒ ํผ ์‰ฌ์šธ๊นŒ์š”?

manylinux ๋„๊ตฌ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. python3.6์ด IIRC๊ฐ€ ๋‚˜์˜จ ํ›„ ๋ช‡ ์ฃผ๊ฐ€ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. @njsmith๋Š” ์•„๋งˆ ๋” ๋งŽ์ด ์•Œ๊ณ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ngoldbaum gcc 4.2 ์„ ํƒ์˜ ์›๋™๋ ฅ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ตœ์‹  ์ปดํŒŒ์ผ๋Ÿฌ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์‰ฝ์Šต๋‹ˆ๊นŒ?

gcc 4.2๋ฅผ ์„ ํƒํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋ชฉํ‘œ๊ฐ€ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ์‹ค์ œ๋กœ ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์„๋งŒํผ ์ถฉ๋ถ„ํžˆ ์˜ค๋ž˜๋œ glibc๋กœ ์ปดํŒŒ์ผ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ตœ์‹  ์ปดํŒŒ์ผ๋Ÿฌ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์‰ฝ์Šต๋‹ˆ๊นŒ?

๋ชจ๋ฅด๊ฒ ์–ด์š”. ๋‚˜๋Š” ๋˜ํ•œ numpy๊ฐ€ ๊ฑด๋ฌผ ๋ฐ”ํ€ด๋ฅผ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š”์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๋‚ด ํ”„๋กœ์ ํŠธ์— Matthew Brett์˜ ๋ฉ€ํ‹ฐ ๋นŒ๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋‚ด ํ”„๋กœ์ ํŠธ์— python3.7 ํœ ์„ ๋นŒ๋“œํ•˜๋ ค๋ฉด ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผํ•ฉ๋‹ˆ๋‹ค.

์ข‹์•„, ์ด๊ฒƒ์ด ์ตœ์ข… ๊ด€๋ จ ๋ฌธ์ œ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ํ•ด๋‹น SSE ์ฝ”๋“œ์—์„œ ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ์ฐพ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

numpy 1.14.0์—์„œ๋Š” FP ์˜ค๋ฅ˜๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ๋Ÿฐํƒ€์ž„ ๊ฒฝ๊ณ ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ผ๋ถ€ ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/numpy/numpy/commit/d47ca7b26172c42b01c3132d0e46e70578c8ea21

๊ทธ๋Ÿฌ๋‚˜ SSE ๊ตฌํ˜„์„ ๋‹ค์‹œ ์‚ดํŽด๋ณด๋ฉด :
https://github.com/numpy/numpy/blob/d7d5cb3feccc1fc6cf57159e8b9fe0a733968706/numpy/core/src/umath/simd.inc.src#L1020

๋ฐฐ์—ด์˜ ๊ฐ€์šด๋ฐ ์ •๋ ฌ ๋œ ๋ถ€๋ถ„ ๋งŒ FPU๋ฅผ ํ†ต๊ณผํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ—ค๋”์™€ ํŠธ๋ ˆ์ผ๋Ÿฌ (๋ฉ”๋ชจ๋ฆฌ ์ •๋ ฌ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— SSEable์ด ์•„๋‹˜)๋Š” ์ˆ˜๋™์œผ๋กœ NaN์„ ํ™•์ธํ•˜๊ณ  FPU๋ฅผ ํ†ตํ•ด ์ด๋™ํ•˜์ง€ ์•Š๋Š” ๋ฐ˜๋ฉด SSE๋Š” ๋”ฐ๋ผ์„œ ์ค‘๊ฐ„ ๋ถ€๋ถ„ ๋งŒ NaN ๊ฒฝ๊ณ ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ณ  ๋‹ค๋ฅธ ๋ถ€๋ถ„ (์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ์—์„œ โ€‹โ€‹๋™์ผ)์€ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ํ™•์ธ์€ ?

np.min ([1, np.nan, 1, 1, 1, 1, 1, 1])์€ ๋Ÿฐํƒ€์ž„ ๊ฒฝ๊ณ ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ np.min ([1, 1, np.nan, 1, 1, 1, 1, 1]) ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

np.min ([1, np.nan, 1, 1, 1, 1, 1, 1])์€ ๋Ÿฐํƒ€์ž„ ๊ฒฝ๊ณ ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@tzickel ์ด๊ฒƒ์€ # 11029์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ์„œ์‹

์†Œ์Šค ๋ฌธ์ œ๋Š” # 8954๋กœ PR # 9020์œผ๋กœ ์ด์–ด์กŒ์Šต๋‹ˆ๋‹ค.

์˜ˆ,ํ•˜์ง€๋งŒ ๋‚ด ์š”์ ์€ # 9020์ด ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋ฅผ ๋‹ค๋ฃจ์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ์ค‘ ํ•˜๋‚˜๋Š”์ด SSE ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค (์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋’ค์ง‘์Šต๋‹ˆ๋‹ค).

# 11029์— ๊ด€ํ•ด์„œ๋Š” NaN ์ „ํŒŒ ๋ฒ„๊ทธ ์™ธ์—๋„ ๊ฒŒ์‹œ๋ฌผ์— ์—ฌ๊ธฐ ์ €๊ธฐ์—์„œ ๋ชจ๋‘ ์™œ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋˜๊ณ  ๋•Œ๋กœ๋Š” ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š”์ง€ ํŒŒ์•…ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ์€ NaN์ด ์ž…๋ ฅ์— ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์ตœ์†Œ / ์ตœ๋Œ€์˜ ๊ฒฐ๊ณผ์ด๊ณ  ์ด๋ฏธ isNan / invalid๋ฅผ ํ™•์ธํ•œ ๊ฒฝ์šฐ NaN์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐœ๊ฒฌ ํ•  ๋•Œ ๋น ๋ฅด๊ฒŒ ์ข…๋ฃŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

@tzickel ๊ฐ์†Œ ์ž‘์—…์ด ์กฐ๊ธฐ ์ข…๋ฃŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ gufuncs๋กœ ๋ฆฌํŒฉํ† ๋ง๋˜๋ฉด ๋ฏธ๋ž˜์— ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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