Tôi đã mảng và chức năng NumPy sau:Đánh giá chức năng sử dụng mảng NumPy trả inf và nan
import numpy
import scipy.special
i = numpy.linspace(0, 500, 501, dtype = int)
def func(x, n):
return scipy.special.eval_hermite(n, x)
Tôi đánh giá chức năng cho mọi phần tử trong mảng NumPy tôi i
sử dụng hai appraoches khác nhau:
Phương pháp 1:
hermites = func(0, i)
phương pháp 2:
hermites = [func(0, idx) for idx in i]
Hai phương pháp tiếp cận dẫn đến hai câu trả lời khác nhau. Chúng khác nhau vì sau phần tử 50
, cách tiếp cận bắt đầu trả lại inf
và nan
. Phương pháp tiếp cận 2 cũng không cung cấp giá trị chính xác cho mọi thành phần của i
. Tuy nhiên, nó có thể tính toán nhiều hơn. Phương pháp 2 không thành công cho i >= 64
.
Cả hai cách tiếp cận cho tôi câu trả lời trong cùng khoảng thời gian (0,7 s cho len(i) = 15000
, được xác định bằng cách sử dụng timeit
). Những gì tôi không hiểu là những kết quả khác nhau. Điều này là do tôi đã học cách tránh for loops
trong python càng nhiều càng tốt. Đây không phải là trường hợp này lần này.
Ý tưởng rằng nó phải làm với bộ nhớ cũng vượt qua tâm trí của tôi. Tuy nhiên, việc đánh giá một phần tử đơn lẻ, tức là print func(0, 64)
cũng trả về 0.
(bằng với đầu ra của phương pháp).
Điều gì đang xảy ra?
Chúng ta có nên chỉnh sửa tiêu đề không? Phần thú vị của câu hỏi không phải là về "tại sao inf và nan", nhưng "tại sao không truyền mảng và sử dụng listcomp cho phần tử iterate bởi phần tử trả về cùng một kết quả?" – DSM
Đạt được kết quả tốt hơn sau khi nâng cấp lên scipy 0.16.0. Tuy nhiên, bây giờ cho 'i> = 270' tôi lại lấy' inf' hoặc 'nan'. Lỗi này đã hoàn toàn chưa (tất cả có thể 'i') đã được sửa trong phiên bản phát triển scipy? Và có cách nào để có được phiên bản này không? –
Đối với 'i> = 270', giá trị của đa thức Hermite tại' x = 0' lớn hơn có thể được biểu diễn bằng các giá trị dấu phẩy động 64 bit, do đó, 'inf' được mong đợi. Đối với 'i> = 300', tôi nhận được' nan'; Tôi đã không nhìn vào nó, nhưng tôi nghi ngờ một số mã kết thúc lên làm 'inf - inf'. –