Numpy: dtype = intλ₯Ό μ‚¬μš©ν•˜λŠ” λ²”μœ„μ—μ„œ 예기치 μ•Šμ€ 좜λ ₯

에 λ§Œλ“  2020λ…„ 05μ›” 05일  Β·  5μ½”λ©˜νŠΈ  Β·  좜처: numpy/numpy


[3]μ—μ„œ : np.arange (-3, 0, 0.5, dtype = int)
좜λ ₯ [3] : λ°°μ—΄ ([-3, -2, -1, 0, 1, 2])

음, "1"κ³Ό "2"λ₯Ό λ³΄λŠ” 것은 두 μˆ«μžκ°€ λͺ¨λ‘ 0보닀 쑰금 더 크기 λ•Œλ¬Έμ— μš°λ¦¬μ—κ²Œ μ•½κ°„μ˜ μ˜ˆμƒμΉ˜ λͺ»ν•œ μΌμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

일반적으둜 이것은 dtype = intκ°€μ—†λŠ” κ²°κ³Όμž…λ‹ˆλ‹€.

In [2]: np.arange(-3, 0, 0.5)                                                  
Out[2]: array([-3. , -2.5, -2. , -1.5, -1. , -0.5])
and we should get this with dtype=int:
In [4]: np.arange(-3, 0, 0.5).astype(int)                                      
Out[4]: array([-3, -2, -2, -1, -1,  0])

numpy 맀뉴얼은 λ‹€μŒκ³Ό 같이 λ§ν•©λ‹ˆλ‹€.
dtype : dtype
좜λ ₯ λ°°μ—΄μ˜ μœ ν˜•μž…λ‹ˆλ‹€. dtype이 μ œκ³΅λ˜μ§€ μ•ŠμœΌλ©΄ λ‹€λ₯Έ μž…λ ₯ μΈμˆ˜μ—μ„œ 데이터 μœ ν˜•μ„ μœ μΆ”ν•˜μ‹­μ‹œμ˜€.

λ”°λΌμ„œ 좜λ ₯ λ°°μ—΄μ—λ§Œ 영ν–₯을 λ―ΈμΉ©λ‹ˆλ‹€.

import numpy as np
print(np.arange(-3, 0, 0.5))
print(np.arange(-3, 0, 0.5, dtype=int))
print(np.arange(-3, 0, 0.5).astype(int))

μ—λŸ¬ λ©”μ‹œμ§€:

였λ₯˜ λ©”μ‹œμ§€κ°€ μ—†μŠ΅λ‹ˆλ‹€ ...

Numpy / Python 버전 정보 :

numpy '1.18.4'(순수 Python 3.7.6) 및 '1.18.1'(μ΅œμ‹  μ—…λ°μ΄νŠΈκ°€ 적용된 Anaconda 3.7)μ—μ„œ ν…ŒμŠ€νŠΈν–ˆμŠ΅λ‹ˆλ‹€. 같은 κ²°κ³Ό.

1.18.4 3.7.6 (κΈ°λ³Έκ°’, 2020 λ…„ 2 μ›” 28 일, 15:25:38)
[Clang 11.0.0 ( https://github.com/llvm/llvm-project.git eefbff0082c5228e01611f7

1.18.1 3.7.4 (κΈ°λ³Έκ°’, 2019 λ…„ 8 μ›” 13 일, 20:35:49)
[GCC 7.3.0]

00 - Bug numpy.core

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

"쀑지"보닀 큰 값을 μ–»λŠ” 것은 정말 쒋지 μ•Šκ³  μ˜ˆμƒμΉ˜ λͺ»ν•œ μΌμž…λ‹ˆλ‹€. arangeκ°€ floatκ°€ μ•„λ‹Œ 경우 floaty numpy μœ ν˜•μ„ ν™•μΈν•˜κ³  μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ dtype에 λŒ€ν•œ μˆ˜λ™ μž…λ ₯은 μ‹€μ œλ‘œ μ‚¬μš©μžκ°€ 좜λ ₯의 astype (dtype) λ³€ν™˜κ³Ό 같은 것을 κΈ°λŒ€ν•  수 μžˆλ„λ‘ν•©λ‹ˆλ‹€.

μ–΄λ•Œ :
1.) μ •μˆ˜κ°€ μ•„λ‹Œ μΈμˆ˜μ— λŒ€ν•œ μ˜ˆμ™Έ (예 : μ‹œμž‘, 쀑지, 단계).
2.) 쀑지> = μ‹œμž‘μΈμ§€ ν™•μΈν•˜κ³ , 그렇지 μ•ŠμœΌλ©΄ μ˜ˆμ™Έ λ°œμƒ
3.) ν•¨μˆ˜ μ‹œμž‘ λΆ€λΆ„μ—μ„œ μ‹œμž‘, 쀑지, 단계λ₯Ό int64둜 μΊμŠ€νŒ…ν•©λ‹ˆλ‹€.
4.) astype (dtype) 좜λ ₯

1 λŒ€μ‹ ) μ •μˆ˜κ°€ μ•„λ‹Œ μž…λ ₯이 발견되면 arange λ‚΄λΆ€μ˜ linspace둜 λ¦¬λ””λ ‰μ…˜ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  5 λŒ“κΈ€

이와 같은 λ²„κ·ΈλŠ” κ³„μ†ν•΄μ„œλ³΄κ³ λ©λ‹ˆλ‹€. μ‹œκ°„μ„ μžƒμ–΄λ²„λ¦° 이유 λ•Œλ¬Έμ—, λ‚˜λŠ” arange의 κ΅¬ν˜„μ΄ λ‹€μŒκ³Ό 같은 것이라고 ν™•μ‹ ν•©λ‹ˆλ‹€.

def arange(start, stop, step, dtype):
    n = (start - stop) // step

    # dtype.type is a cast
    step = dtype.type(start + step) - dtype.type(start)

    # now do what you expect
    return [start + step*i for i in range(n)]

λ¬Έμ„œμ— μ˜μ‚¬ μ½”λ“œλ₯Ό μΆ”κ°€ν•΄μ•Όν• κΉŒμš”?

예, κ·Έ μ½”λ“œλŠ” μ •ν™•ν•©λ‹ˆλ‹€ ( n 계산에 λŒ€ν•΄ 100 % ν™•μ‹ ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€). 이 νŠΉμ • μ˜ˆλŠ” 맀우 극단적이고 λΆ„λͺ…νžˆ κΉ¨μ‘ŒμŠ΅λ‹ˆλ‹€. μ–΄λ–»κ²Œ λ“  μ‹€μ œλ‘œ 제거 ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

arange 은 (λŠ”) 틀림없이 잘λͺ»λœ μ •μ˜λ‘œ 인해 반볡적으둜 미움을 λ°›κ³  μžˆμ§€λ§Œ,이 문제λ₯Ό ν•΄κ²°ν•˜κΈ°μœ„ν•œ 정말 쒋은 μ œμ•ˆμ„ 생각할 수 μ—†μŠ΅λ‹ˆλ‹€ (μ•„λ§ˆλ„ 이전에 ν•˜λ‚˜κ°€ λ‚˜μ™”μ„μ§€λΌλ„).
float에 λŒ€ν•œ arange λ™μž‘μ„ 잘 λ³€κ²½ν•  μˆ˜μžˆλŠ” κ²ƒκ³ΌλŠ” λ‹€λ¦…λ‹ˆλ‹€ (μ •ν™•ν•œ μˆ˜μ •μ΄μ§€λ§Œ 끝점 변경은 쒋은 IMOκ°€ μ•„λ‹™λ‹ˆλ‹€). κ·Έλž˜μ„œ μš°λ¦¬λŠ” μƒˆλ‘œμš΄ ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•  κ²ƒμž…λ‹ˆλ‹€.ν•˜μ§€λ§Œ λŒ€λΆ€λΆ„μ˜ 경우 linspace κ°€ "μ˜¬λ°”λ₯Έ"float arange보닀 λ‚«λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. μˆ˜μ • 된 float-arangeκ°€ μ‹€μ œλ‘œ μ‚¬μš© 사둀가 λ„ˆλ¬΄ λ§ŽμŠ΅λ‹ˆλ‹€.

κ²°κ΅­, λ‚˜λŠ” 잘 μƒκ°ν•œ μ œμ•ˆμ„ μ›ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€ : / ...

"쀑지"보닀 큰 값을 μ–»λŠ” 것은 정말 쒋지 μ•Šκ³  μ˜ˆμƒμΉ˜ λͺ»ν•œ μΌμž…λ‹ˆλ‹€. arangeκ°€ floatκ°€ μ•„λ‹Œ 경우 floaty numpy μœ ν˜•μ„ ν™•μΈν•˜κ³  μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ dtype에 λŒ€ν•œ μˆ˜λ™ μž…λ ₯은 μ‹€μ œλ‘œ μ‚¬μš©μžκ°€ 좜λ ₯의 astype (dtype) λ³€ν™˜κ³Ό 같은 것을 κΈ°λŒ€ν•  수 μžˆλ„λ‘ν•©λ‹ˆλ‹€.

μ–΄λ•Œ :
1.) μ •μˆ˜κ°€ μ•„λ‹Œ μΈμˆ˜μ— λŒ€ν•œ μ˜ˆμ™Έ (예 : μ‹œμž‘, 쀑지, 단계).
2.) 쀑지> = μ‹œμž‘μΈμ§€ ν™•μΈν•˜κ³ , 그렇지 μ•ŠμœΌλ©΄ μ˜ˆμ™Έ λ°œμƒ
3.) ν•¨μˆ˜ μ‹œμž‘ λΆ€λΆ„μ—μ„œ μ‹œμž‘, 쀑지, 단계λ₯Ό int64둜 μΊμŠ€νŒ…ν•©λ‹ˆλ‹€.
4.) astype (dtype) 좜λ ₯

1 λŒ€μ‹ ) μ •μˆ˜κ°€ μ•„λ‹Œ μž…λ ₯이 발견되면 arange λ‚΄λΆ€μ˜ linspace둜 λ¦¬λ””λ ‰μ…˜ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš” μ €λŠ” μ˜€ν”ˆ μ†ŒμŠ€ 기여에 λŒ€ν•œ μ™„μ „ν•œ μ΄ˆλ³΄μžμž…λ‹ˆλ‹€. μ‹œλ„ν•΄ λ³Ό 생각. 이 슀 λ‹ˆνŽ«μ€ μ–΄λ–»μŠ΅λ‹ˆκΉŒ? @ eric-wieser

x = []
for i in range(start, stop):
    x.append(i)
    x.append(i+step)
print(np.array(x, dtype))

이와 같은 λ²„κ·ΈλŠ” κ³„μ†ν•΄μ„œλ³΄κ³ λ©λ‹ˆλ‹€. μ‹œκ°„μ„ μžƒμ–΄λ²„λ¦° 이유 λ•Œλ¬Έμ—, λ‚˜λŠ” arange의 κ΅¬ν˜„μ΄ λ‹€μŒκ³Ό 같은 것이라고 ν™•μ‹ ν•©λ‹ˆλ‹€.

def arange(start, stop, step, dtype):
    n = (start - stop) // step

    # dtype.type is a cast
    step = dtype.type(start + step) - dtype.type(start)

    # now do what you expect
    return [start + step*i for i in range(n)]
이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰