2016-12-28 35 views
3

total_minutes_by_account是一本帶有帳戶值的詞典。無法對字典上的值進行numpy操作

total_min顯示逗號分隔的值,但在下面得到錯誤。

total_min=total_minutes_by_account.values() 
import numpy as np 
np.mean(total_min) 

File "<ipython-input-17-7834a3d1e5e6>", line 1, in <module> 
    np.mean(total_min) 

    File "/Users/newtopython/anaconda/lib/python3.5/site-packages/numpy/core/fromnumeric.py", line 2942, in mean 
    out=out, **kwargs) 

    File "/Users/newtopython/anaconda/lib/python3.5/site-packages/numpy/core/_methods.py", line 72, in _mean 
    ret = ret/rcount 

TypeError: unsupported operand type(s) for /: 'dict_values' and 'int' 
+1

呃...是的。 'np.mean'需要數組,或至少arraylikes。你不能給它一個字典值的觀點。 – user2357112

+1

嘗試進行數組轉換。我對np.array(d.values())'與np.array(list(d.values()))'不是一樣的結果感到有些驚訝。 – wim

回答

5

在PY3,adict.values()返回dict_values對象,而不是一個列表。 numpy函數期望numpy數組或列表(列表)。

In [1618]: dd = {'a':[1,2,3], 'b':[4,5,6]} 
In [1619]: dd 
Out[1619]: {'a': [1, 2, 3], 'b': [4, 5, 6]} 
In [1620]: dd.values() 
Out[1620]: dict_values([[1, 2, 3], [4, 5, 6]]) 
In [1621]: np.mean(dd.values()) 
... 
TypeError: unsupported operand type(s) for /: 'dict_values' and 'int' 

轉換dict_values列出:

In [1623]: list(dd.values()) 
Out[1623]: [[1, 2, 3], [4, 5, 6]] 
In [1624]: np.mean(list(dd.values())) 
Out[1624]: 3.5 

在PY3,rangedict.keys()需要相同的額外的接觸。

========

np.mean首先嚐試輸入轉換爲數組,但values()這不是我們想要的。它使單個項目對象數組包含整個對象。

In [1626]: np.array(dd.values()) 
Out[1626]: array(dict_values([[1, 2, 3], [4, 5, 6]]), dtype=object) 
In [1627]: _.shape 
Out[1627]:() 
In [1628]: np.array(list(dd.values())) 
Out[1628]: 
array([[1, 2, 3], 
     [4, 5, 6]]) 
+0

[Python 3'range'其實很好](http://ideone.com/z3DL4m),因爲它是一個序列,而不僅僅是一個可迭代的。 – user2357112