Numpy: np.uint64 슀칼라 μœ ν˜•μ—μ„œ np.left_shift 및 np.right_shift μ‹€νŒ¨ (Trac # 1931)

에 λ§Œλ“  2012λ…„ 10μ›” 20일  Β·  7μ½”λ©˜νŠΈ  Β·  좜처: numpy/numpy

_2011-08-10 trac μ‚¬μš©μž tlatorre의 원본 ν‹°μΌ“ http://projects.scipy.org/numpy/ticket/1931 , unknown에 ν• λ‹Ή 됨 ._

>>> np.uint64(5) << 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ufunc 'left_shift' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule 'safe'
>>> np.uint64(5) >> 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ufunc 'right_shift' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule 'safe'
00 - Bug numpy.core

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

더 μ‰¬μš΄ ν•΄κ²° 방법은 μ‹œν”„νŠΈμ— λΆ€ν˜Έμ—†λŠ” μ •μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

np.uint64(5) << np.uint64(1)

@charrisκ°€ μœ„μ—μ„œ μ–ΈκΈ‰ν–ˆλ“―μ΄ λ¬Έμ œλŠ” dtype이 κ· μΌν•˜κ²Œ λ§Œλ“€μ–΄μ§€λŠ” 방식에 μžˆμŠ΅λ‹ˆλ‹€. 일반적으둜 μˆ˜μ •ν•˜λŠ” 것은 그리 μ‰¬μš΄ 일이 μ•„λ‹ˆμ§€λ§Œ (# 5668 μ°Έμ‘°) μ‹œν”„νŠΈ μ—°μ‚°μžλŠ” νŠΉμˆ˜ν•œ κ²½μš°κ°€μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. (PR ν™˜μ˜ν•©λ‹ˆλ‹€, λ§ν–ˆλ“―μ΄ 이것은 μ‚¬μ†Œν•œ 것은 μ•„λ‹ˆμ§€λ§Œ ufucs의 λ‚΄λΆ€ 루프가 μ–΄λ–»κ²Œ κ²°μ •λ˜λŠ”μ§€μ— λŒ€ν•œ κ³΅μ •ν•œ 이해가 ν•„μš”ν•©λ‹ˆλ‹€ ...).

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

_ @ charris λ‹˜ 이 2011-08-13에 μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€

μ΄λŠ” μ‹œν”„νŠΈ λ²ˆν˜Έκ°€ λΆ€ν˜ΈμžˆλŠ” μœ ν˜•μœΌλ‘œ λ³€ν™˜λ˜κ³  uint64λ₯Ό 보유 ν• λ§ŒνΌ 큰 λΆ€ν˜ΈμžˆλŠ” μ •μˆ˜ μœ ν˜•μ΄ μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. μ‹œν”„νŠΈ μ—°μ‚°μžλŠ” νŠΉμˆ˜ν•œ κ²½μš°κ°€ ν•„μš”ν•©λ‹ˆλ‹€. ν•˜λ“œμ›¨μ–΄κ°€ λΆˆν•„μš”ν•œ λΉ„νŠΈλ₯Ό 가리기 λ•Œλ¬Έμ— Intelμ—μ„œλ„ μ‹€νŒ¨ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 즉, int32의 경우 ν•˜μœ„ 5 λΉ„νŠΈ 만 ν™•μΈλ©λ‹ˆλ‹€.

_trac μ‚¬μš©μž parejkoj λ‹˜μ΄ 2012-07-27_에 μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒ λžŒλ‹€λ‘œμ΄ 문제λ₯Ό μ½”λ”© ν•  μˆ˜μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

lshift = lambda x,s: np.uint64(x)*np.uint64(2**s)

이것은 μž‘λ™ν•˜μ§€λ§Œ 이상적이지 μ•ŠμŠ΅λ‹ˆλ‹€. 이 문제λ₯Ό numpyμ—μ„œ μˆ˜μ •ν•˜λ©΄ 맀우 μœ μš©ν•©λ‹ˆλ‹€.

5 λ…„ ν›„ ...이게 μ€‘μš”ν•œ 문제 μ•„λ‹™λ‹ˆκΉŒ? λΆ€ν˜Έμ—†λŠ” μ •μˆ˜λŠ” μ‹œν”„νŠΈμ— λŒ€ν•΄ λͺ¨ν˜Έν•˜μ§€ μ•Šμ•„μ•Όν•©λ‹ˆλ‹€.

더 μ‰¬μš΄ ν•΄κ²° 방법은 μ‹œν”„νŠΈμ— λΆ€ν˜Έμ—†λŠ” μ •μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

np.uint64(5) << np.uint64(1)

@charrisκ°€ μœ„μ—μ„œ μ–ΈκΈ‰ν–ˆλ“―μ΄ λ¬Έμ œλŠ” dtype이 κ· μΌν•˜κ²Œ λ§Œλ“€μ–΄μ§€λŠ” 방식에 μžˆμŠ΅λ‹ˆλ‹€. 일반적으둜 μˆ˜μ •ν•˜λŠ” 것은 그리 μ‰¬μš΄ 일이 μ•„λ‹ˆμ§€λ§Œ (# 5668 μ°Έμ‘°) μ‹œν”„νŠΈ μ—°μ‚°μžλŠ” νŠΉμˆ˜ν•œ κ²½μš°κ°€μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. (PR ν™˜μ˜ν•©λ‹ˆλ‹€, λ§ν–ˆλ“―μ΄ 이것은 μ‚¬μ†Œν•œ 것은 μ•„λ‹ˆμ§€λ§Œ ufucs의 λ‚΄λΆ€ 루프가 μ–΄λ–»κ²Œ κ²°μ •λ˜λŠ”μ§€μ— λŒ€ν•œ κ³΅μ •ν•œ 이해가 ν•„μš”ν•©λ‹ˆλ‹€ ...).

더 μ‰¬μš΄ ν•΄κ²° 방법은 μ‹œν”„νŠΈμ— λΆ€ν˜Έμ—†λŠ” μ •μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

np.uint64 (5) << np.uint64 (1)

... μˆ˜λ§Žμ€ μ •μˆ˜λ‘œ μž‘λ™ν•˜κ³  μžˆλ‹€λŠ” 것을 μ•Œκ³  μžˆμ§€λ§Œ 일반 μ½”λ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 (특히 λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ 이미 μž‘μ„±λ˜μ—ˆμœΌλ©° μ œμ–΄ ν•  μˆ˜μ—†λŠ” 것) λ‹€μŒκ³Ό 같이 μž‘λ™ν•©λ‹ˆλ‹€.

def f(x):
    return x | (x >> 1)

그러면 일반 Python μ •μˆ˜μ™€ np.uint64 μœ ν˜• λͺ¨λ‘μ—μ„œ μž‘λ™ν•˜λ„λ‘ λ§Œλ“€ 수 μ—†μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 이것이 μ‚¬μ†Œν•œ 것이라고 λ§ν•˜λ €λŠ” 것은 μ•„λ‹ˆμ§€λ§Œ (λ‚΄ μŠ€ν‚¬ 셋보닀 μœ„μ˜ wayyyy) μš°μ„  μˆœμœ„κ°€ λ†’μ•„μ•Όν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

@ jason-s-λ¬Έμ œκ°€ 맀우 μ„±κ°€μ‹œλ‹€λŠ” 데 λ™μ˜ν•©λ‹ˆλ‹€ ... μŠ¬ν”„κ²Œλ„ ufuncκ°€ λ‚΄λΆ€μ μœΌλ‘œ μž‘λ™ν•˜λŠ” 방식에 λŒ€ν•΄ μΆ©λΆ„νžˆ μ •ν†΅ν•œ μ‚¬λžŒμ€ λ§Žμ§€ μ•ŠμŠ΅λ‹ˆλ‹€ ...

μ•„λ§ˆλ„ 일반적인 ufunc 기계에 μ˜μ‘΄ν•˜λŠ” λŒ€μ‹  λ°©λ²•μ˜ 이동을 μœ„ν•΄ 적어도 νŠΉλ³„ν•œ 경우 슀칼라λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. @charris : 이것이 당신이 염두에 λ‘” κ²ƒμž…λ‹ˆλ‹€ (6 λ…„ 후에 그것을 κΈ°μ–΅ν•  수 μžˆλ‹€λ©΄ ;-).

# 8002도 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

개인적으둜 λͺ¨λ“  것을 λ‹€μ‹œ ν•  수 μžˆλ‹€λ©΄ λͺ¨λ“  μΊμŠ€νŒ… / κ°•μ œλ₯Ό λ‹€μ‹œ μ‹€ν–‰ν•˜μ—¬ numpy μΊμŠ€νŒ…μ΄ 기본적으둜 C μΊμŠ€νŒ…μ²˜λŸΌ λ™μž‘ν•˜κ³  C에 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우 C μΊμŠ€νŒ…μ˜ 정신을 λ”°λ₯΄λ„λ‘ν•˜κ² μŠ΅λ‹ˆλ‹€. κ·œμΉ™μ€ λ‹€μ†Œ μ΄μƒν•˜κ³  λ•Œλ‘œλŠ” ν˜Όλž€ μŠ€λŸ½μŠ΅λ‹ˆλ‹€ (예 : uint64 + int64 μ—μ„œ float64 둜의 λ³€ν™˜). κ·ΈλŸ¬λ‚˜ μš°λ¦¬λŠ” λͺ©λ‘μ—μ„œ 이것을 많이 λ…Όμ˜ν–ˆκ³  λ³€κ²½ν•˜κΈ°κ°€ μ–΄λ €μ›Œ λ³΄μž…λ‹ˆλ‹€.

이와 같은 상황이 λ°œμƒν•˜λ©΄ (제 의견 μ°Έμ‘°) np.uint64 λͺ¨λ“  단일 값을 λž˜ν•‘ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰