2014-05-22 17 views
10

Tôi nhận ngoại lệ này vì lý do tôi không hiểu. Nó là khá phức tạp, nơi tôi np.array v đến từ đâu, nhưng đây là mã khi ngoại lệ xảy ra:Ngoại lệ không mong muốn trong numpy.isfinite()

print v, type(v) 

for val in v: 
    print val, type(val) 

print "use isfinte() with astype(float64): " 
np.isfinite(v.astype("float64")) 

print "use isfinite() as usual: " 
try: 
    np.isfinite(v) 
except Exception,e: 
    print e 

Điều này cho phép đầu ra sau đây:

[6.4441947744288255 7.2246449651781788 4.1028442021807656 
4.8832943929301189] <type 'numpy.ndarray'> 

6.44419477443 <type 'numpy.float64'> 
7.22464496518 <type 'numpy.float64'> 
4.10284420218 <type 'numpy.float64'> 
4.88329439293 <type 'numpy.float64'> 

np.isfinte() with astype(float64): 
[ True True True True] 

np.isfinte() as usual: 
ufunc 'isfinite' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe'' 

Tôi không hiểu được TypeError . Tất cả các phần tử là np.float64 và sẽ ổn. Có thể là một lỗi? Lỗi này đôi khi chỉ thỉnh thoảng xảy ra, nhưng tôi không thể tìm thấy sự khác biệt giữa các mảng. Luôn luôn có cùng loại.

Xin cảm ơn trước.

EDIT: Ví dụ làm việc:

Cấu trúc dữ liệu nhỏ như trình bày ở trên.

import pandas as pd 
import numpy as np 


def forward_estim(H,end): 

    old_idx = H.index 
    new_idx = pd.period_range(old_idx[-1],end,freq=old_idx.freq) 

    H_estim = pd.DataFrame(columns=["A","B","C","D"],index=new_idx) 

    H_chg = H.values[1:]-H.values[:-1] 
    mean_ = H_chg.mean() 
    std_ = H_chg.std() 

    H_estim.ix[0] = H.ix[-1] 

    for i in range(1,len(H_estim)): 
     H_estim.A[i] = H_estim.A[i-1] + mean_ + std_/2 
     H_estim.B[i] = H_estim.B[i-1] + mean_ + std_ 
     H_estim.C[i] = H_estim.C[i-1] + mean_ - std_ 
     H_estim.D[i] = H_estim.D[i-1] + mean_ - std_/2 

    return H_estim.ix[1:] 


H_idx = pd.period_range("2010-01-01","2012-01-01",freq="A") 
print H_idx 

H = pd.Series(np.array([2.3,3.0,2.9]),index=H_idx) 
print H 

H_estim = forward_estim(H,"2014-01-01") 
print H_estim 

np.isfinite(H_estim.values.astype("float64")) 
print "This works!" 

np.isfinite(H_estim.values) 
print "This does not work!" 

này được điều hành ở đây sử dụng:

MacOSX Mavericks, Python 2.7.6, 1.8.1 NumPy, gấu trúc 0.13.1

+0

Bạn chắc chắn nên nêu rõ phiên bản nào của Python và bạn đang làm việc trên hệ thống nào. Nó sẽ là lợi ích lớn nếu bạn có thể đưa ra một ví dụ tối thiểu tái tạo vấn đề. –

+0

Đã chỉnh sửa Bài đăng gốc bằng một ví dụ. Điều này sẽ ném ngoại lệ được đề cập ở trên trên máy tính của tôi/thiết lập python. – user2532323

Trả lời

10

H_estim.values là một mảng NumPy với kiểu dữ liệu object (hãy nhìn vào H_estim.values.dtype):

In [62]: H_estim.values 
Out[62]: 
array([[3.4000000000000004, 3.6000000000000005, 2.7999999999999998, 3.0], 
     [3.9000000000000004, 4.3000000000000007, 2.6999999999999993, 
     3.0999999999999996]], dtype=object) 

In [63]: H_estim.values.dtype 
Out[63]: dtype('O') 

Trong một mảng object, dữ liệu được lưu trữ trong bộ nhớ của mảng là con trỏ đến đối tượng python, không chính các đối tượng. Trong trường hợp này, các đối tượng là np.float64 trường hợp:

In [65]: H_estim.values[0,0] 
Out[65]: 3.4000000000000004 

In [66]: type(H_estim.values[0,0]) 
Out[66]: numpy.float64 

Vì vậy, trong nhiều khía cạnh, mảng này trông và hoạt động như một mảng của np.float64 giá trị, nhưng nó không phải là như nhau. Đặc biệt, các ufuncs (bao gồm np.isfinite) không xử lý các mảng đối tượng.

H_estim.values.astype(np.float64) chuyển mảng thành một với kiểu dữ liệu np.float64 (ví dụ: mảng trong đó phần tử mảng là giá trị dấu phẩy động thực tế, không trỏ đến đối tượng). So sánh phần sau với kết quả được hiển thị ở trên cho H_estim.values.

In [70]: a = H_estim.values.astype(np.float64) 

In [71]: a 
Out[71]: 
array([[ 3.4, 3.6, 2.8, 3. ], 
     [ 3.9, 4.3, 2.7, 3.1]]) 

In [72]: a.dtype 
Out[72]: dtype('float64') 
+0

Cảm ơn, Warren. Điều này trả lời câu hỏi của tôi một cách chi tiết. Để thêm vào câu hỏi của tôi: Đây là lần thứ hai hành vi "bất ngờ" có thể bị phá vỡ bằng cách sử dụng .astype(). – user2532323

+0

... Vì vậy, tôi có làm điều gì đó không bình thường ở đây trong hàm forward_estim() hay là một trong những nhược điểm với ngôn ngữ được gõ động mà bạn có xu hướng bỏ qua/quên suy nghĩ về kiểu (và "cấu trúc kiểu nội bộ" của packeges) và các loại lệnh "thi hành" như .astype() đơn giản là những điều bạn phải làm đôi khi. Chức năng này thuộc về khoảng 10.000 dòng mã và cho đến nay mọi thứ hoạt động suôn sẻ. – user2532323

+1

Mảng đối tượng được tạo bởi Pandas. Pandas sử dụng mảng đối tượng như một cách thuận tiện để xử lý các mảng chứa các kiểu dữ liệu không đồng nhất, và nó thường hoạt động tốt, nhưng đôi khi, vâng, bạn phải nhận thức được các giới hạn của nó. Bằng cách này, nếu bạn đang sử dụng 'isfinite' để kiểm tra NaN, bạn có thể sử dụng hàm Pandas' isnull' ('pd.isnull', hoặc phương thức DataFrame). Nhưng 'isnull' không giúp đỡ nếu bạn đang kiểm tra' np.inf'. –

1

Bạn cho rằng "Tất cả các yếu tố này là np.float64 và sẽ ổn thôi. ". Tuy nhiên, điều này có thể không phải là trường hợp. Cấu trúc dữ liệu lớn bao nhiêu? Bạn có thể xem xét tất cả các giá trị và tìm thấy điều gì đó đáng ngờ không? Từ http://matplotlib.1069221.n5.nabble.com/type-error-with-python-3-2-and-version-1-1-1-of-matplotlib-numpy-error-td38784.html, chúng tôi thấy rằng sự cố này có thể xuất hiện với các loại dữ liệu Decimal. Có cách nào để bạn tạo ra một ví dụ làm việc tối thiểu tái tạo vấn đề? Nó sẽ là có thể, và khi bạn tạo ví dụ này, nó rất có thể đã xác định được vấn đề.

+0

Cảm ơn bạn đã liên kết. Tôi thấy rằng trước khi yêu cầu. Đó là lý do tại sao tôi đã viết vòng lặp for in loại() của dữ liệu để xác nhận chúng là np.float64. Đó là điều làm tôi bối rối, khi sử dụng.astype ("float64") sẽ giúp mặc dù dữ liệu đã thuộc loại này. – user2532323

Các vấn đề liên quan