2017-05-09 15 views
6

Các hàm numpy, ví dụ: np.mean(), np.var(), v.v., chấp nhận đối số giống như mảng, như np.array hoặc danh sách, v.v.Chức năng numpy hoạt động như thế nào trên các đối tượng gấu trúc trong nội bộ?

Nhưng truyền trong khung dữ liệu gấu trúc cũng hoạt động. Điều này có nghĩa rằng một khung dữ liệu gấu trúc thực sự có thể ngụy trang chính nó như là một mảng numpy, mà tôi tìm thấy một chút lạ (mặc dù biết thực tế là các giá trị cơ bản của một df thực sự là mảng numpy).

Đối với một đối tượng là một mảng giống như, tôi nghĩ rằng nó nên được slicable bằng cách sử dụng chỉ số nguyên theo cách một mảng numpy được thái lát. Vì vậy, ví dụ df [1: 3, 2: 3] sẽ hoạt động, nhưng nó sẽ dẫn đến một lỗi.

Vì vậy, có thể một khung dữ liệu được chuyển đổi thành mảng numpy khi nó đi vào bên trong hàm. Nhưng nếu đó là trường hợp thì tại sao np.mean (numpy_array) dẫn đến một kết quả khác với kết quả của np.mean (df)?

a = np.random.rand(4,2) 
a 
Out[13]: 
array([[ 0.86688862, 0.09682919], 
    [ 0.49629578, 0.78263523], 
    [ 0.83552411, 0.71907931], 
    [ 0.95039642, 0.71795655]]) 

np.mean(a) 
Out[14]: 0.68320065182041034 

đưa ra một kết quả khác với những gì dưới đây cho phép ...

df = pd.DataFrame(data=a, index=range(np.shape(a)[0]), 
columns=range(np.shape(a)[1])) 

df 
Out[18]: 
     0   1 
0 0.866889 0.096829 
1 0.496296 0.782635 
2 0.835524 0.719079 
3 0.950396 0.717957 

np.mean(df) 
Out[21]: 
0 0.787276 
1 0.579125 
dtype: float64 

Sản lượng trước đây là một số duy nhất, trong khi sau này là một nghĩa cột-khôn ngoan. Làm thế nào để một hàm numpy biết về việc tạo một khung dữ liệu?

+0

Để sử dụng dữ liệu mảng cơ bản, chúng ta cần phải sử dụng '.values'. Không có nó, nó không chính xác dữ liệu mảng. Các kết quả phải nhất quán sau đó với fpss NumPy. – Divakar

Trả lời

4

Nếu bạn bước qua chuyện này:

--Call-- 
> d:\winpython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\numpy\core\fromnumeric.py(2796)mean() 
-> def mean(a, axis=None, dtype=None, out=None, keepdims=False): 
(Pdb) s 
> d:\winpython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\numpy\core\fromnumeric.py(2877)mean() 
-> if type(a) is not mu.ndarray: 
(Pdb) s 
> d:\winpython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\numpy\core\fromnumeric.py(2878)mean() 
-> try: 
(Pdb) s 
> d:\winpython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\numpy\core\fromnumeric.py(2879)mean() 
-> mean = a.mean 

Bạn có thể thấy rằng type không phải là một ndarray nên nó cố gắng gọi a.mean mà trong trường hợp này sẽ là df.mean():

In [6]: 

df.mean() 
Out[6]: 
0 0.572999 
1 0.468268 
dtype: float64 

Đây là tại sao đầu ra khác nhau

Mã để tạo lại ở trên:

In [3]: 
a = np.random.rand(4,2) 
a 

Out[3]: 
array([[ 0.96750329, 0.67623187], 
     [ 0.44025179, 0.97312747], 
     [ 0.07330062, 0.18341157], 
     [ 0.81094166, 0.04030253]]) 

In [4]:  
np.mean(a) 

Out[4]: 
0.52063384885403818 

In [5]:  
df = pd.DataFrame(data=a, index=range(np.shape(a)[0]), 
columns=range(np.shape(a)[1])) 
​ 
df 

Out[5]: 
      0   1 
0 0.967503 0.676232 
1 0.440252 0.973127 
2 0.073301 0.183412 
3 0.810942 0.040303 

NumPy đầu ra:

In [7]: 
np.mean(df) 

Out[7]: 
0 0.572999 
1 0.468268 
dtype: float64 

Nếu bạn đã gọi .values để trả về một mảng np sau đó đầu ra là như nhau:

In [8]: 
np.mean(df.values) 

Out[8]: 
0.52063384885403818 
Các vấn đề liên quan