2016-02-05 15 views
5

Tại sao Pandas ép buộc float32 NumPy tôi để float64 trong đoạn mã này:Tại sao Pandas ép buộc float32 numpy của tôi để float64?

>>> import pandas as pd 
>>> import numpy as np 
>>> df = pd.DataFrame([[1, 2, 'a'], [3, 4, 'b']], dtype=np.float32) 
>>> A = df.ix[:, 0:1].values 
>>> df.ix[:, 0:1] = A 
>>> df[0].dtype 
dtype('float64') 

Các hành vi có vẻ rất lạ với tôi ngạc nhiên rằng nếu nó là một lỗi. Tôi đang sử dụng phiên bản Pandas 0.17.1 (cập nhật phiên bản PyPI) và tôi lưu ý rằng có nhiều lỗi đã được khắc phục gần đây, xem https://github.com/pydata/pandas/issues/11847. Tôi đã không thử các đoạn mã với một bậc thầy GitHub cập nhật.

Có phải là lỗi hoặc tôi hiểu nhầm một số "tính năng" trong Pandas? Nếu nó là một tính năng, thì làm thế nào để tôi có được nó?

(Vấn đề ép buộc liên quan đến một câu hỏi gần đây tôi hỏi về việc thực hiện nhiệm vụ Pandas: Assignment of Pandas DataFrame with float32 and float64 slow)

+0

Nó có thể kỳ quặc nhưng nó phù hợp với vón cục. Numpy tự động chuyển ngay cả số nguyên thành các loại numpy.float64. Kể từ khi Pandas đã gumpy ở lõi, chức năng này được mong đợi IMO (mặc dù chắc chắn không phải lý tưởng trong trường hợp của bạn). – Benji

+0

Nhưng 'gấu trúc' có xu hướng sử dụng 'dtype = object' lớn hơn đồng bằng 'numpy'. Nó cho phép nó linh hoạt hơn khi xử lý các kiểu hỗn hợp - các chuỗi có thể có chiều dài bất kỳ, các cột có thể kết hợp các loại, vv Nhưng tính linh hoạt đi kèm với chi phí tính toán và bộ nhớ. – hpaulj

Trả lời

1

Tôi nghĩ rằng đó là giá trị đăng này như một vấn đề GitHub. Hành vi này chắc chắn không nhất quán.

Mã sẽ lấy một nhánh khác dựa trên việc DataFrame có hỗn hợp hay không (source).

  • Trong trường hợp hỗn hợp kiểu các ndarray được chuyển đổi vào một danh sách Python của float64 số và sau đó chuyển đổi trở lại thành float64 ndarray bất chấp thông tin dtypes của DataFrame (function maybe_convert_objects()).

  • Trong trường hợp không có kiểu hỗn hợp, nội dung DataFrame được cập nhật khá nhiều trực tiếp (source) và DataFrame giữ các kiểu float32 của nó.

+0

Tôi đã tạo một vấn đề mới: https: // github.com/pydata/pandas/issues/12255 –

1

Không phải là câu trả lời, nhưng vui chơi giải trí của tôi về vấn đề:

In [2]: df = pd.DataFrame([[1, 2, 'a'], [3, 4, 'b']], dtype=np.float32) 
In [3]: df.dtypes 
Out[3]: 
0 float32 
1 float32 
2  object 
dtype: object 
In [4]: A=df.ix[:,:1].values 
In [5]: A 
Out[5]: 
array([[ 1., 2.], 
     [ 3., 4.]], dtype=float32) 
In [6]: df.ix[:,:1] = A 
In [7]: df.dtypes 
Out[7]: 
0 float64 
1 float64 
2  object 
dtype: object 
In [8]: pd.__version__ 
Out[8]: '0.15.0' 

Tôi không phải là quen thuộc với pandas như numpy, nhưng tôi bối rối là tại sao ix[:,:1] mang lại cho tôi một cột 2 kết quả. Trong numpy loại chỉ mục đó chỉ cho 1 cột.

Nếu tôi gán một cột duy nhất dtype không thay đổi

In [47]: df.ix[:,[0]]=A[:,0] 
In [48]: df.dtypes 
Out[48]: 
0 float32 
1 float32 
2  object 

Những hành động tương tự mà không kiểu dữ liệu hỗn hợp không thay đổi dtypes

In [100]: df1 = pd.DataFrame([[1, 2, 1.23], [3, 4, 3.32]], dtype=np.float32) 
In [101]: A1=df1.ix[:,:1].values 
In [102]: df1.ix[:,:1]=A1 
In [103]: df1.dtypes 
Out[103]: 
0 float32 
1 float32 
2 float32 
dtype: object 

Mấu chốt phải rằng với các giá trị khác nhau, khung dữ liệu, theo một nghĩa nào đó hoặc khác, một mảng dtype=object, cho dù đó là đúng với bộ nhớ dữ liệu nội bộ hay chỉcủa nó Giao diện.

In [104]: df1.as_matrix() 
Out[104]: 
array([[ 1.  , 2.  , 1.23000002], 
     [ 3.  , 4.  , 3.31999993]], dtype=float32) 
In [105]: df.as_matrix() 
Out[105]: 
array([[1.0, 2.0, 'a'], 
     [3.0, 4.0, 'b']], dtype=object) 
+0

Chuyển nhượng với một cột đơn và tên cột lặp cho dường như cho hiệu suất hợp lý cho nhiệm vụ "trong loại" (không đúc) và cho ra loại chính xác. Tuy nhiên phương pháp đó là hơn hai lần chậm nếu có đúc đến và đi từ float32 và float64. Tôi cho rằng nhiều sự tái phân bổ sẽ giải thích vấn đề thứ hai. –

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