2011-05-17 7 views
20

python + numpy: işleneni çok büyük olduğunda numpy.log neden bir özellik hatası atar?

np.log(math.factorial(21)) 

çalışan bir AttributeError: log atar. Neden? Bir ValueError veya bir çeşit UseYourHighSchoolMathsError hayal edebiliyordum, ama neden özellik hatası?

+4

NumPy, ilk önce argümanı skaler türlerinden birine dönüştürmeyi dener ve sonra NumPy'ye özgü özniteliğe erişmeye çalışır. math.factorial (21) 'numpy.uint64 'boyutundan farklıdır, bu nedenle NumPy skalar' a dönüştürülemez. Elbette NumPy * bir "ValueError" a atmalı! –

+0

Ayrıca, [belirli değerler için işlev oluştururken python/numpy öğesindeki AttributeError] bölümüne bakın (/ questions/18833639/belirli bir değer için oluşturduğunda-false-false-false) – tripleee

cevap

24

math.factorial(21) sonucu bir Python uzunluğundadır. numpy onu sayısal türlerinden birine dönüştüremez, dolayısıyla dtype=object olarak bırakır. Tekli ufunc'ların nesne dizileri için kullandıkları yol, nesnede aynı adın bir yöntemini çağırmayı denemeleridir. Örneğin. Python uzun üzerinde hiçbir .log() yöntem olduğundan

np.log(np.array([x], dtype=object)) <-> np.array([x.log()], dtype=object) 

, sen AttributeError olsun.

+1

Wow, bu bir çok şeyi açıklar. eşyalar –

4

math.log() işlevini tercih edin, bu iş uzun tamsayılarda bile geçerlidir.

İlgili konular