2017-05-23 34 views
0

任何人都可以闡明爲什麼這個數組值賦值會導致numpy.cross()上的錯誤?爲什麼.as_matrix()調用在計算交叉乘積時導致錯誤?

假設dfAnalysis是一個熊貓數據框,它包含x_rel,y_rel和z_rel作爲列標籤作爲其數據類型條目的浮點值。

當像下面的代碼片段提取它的數據...

A = dfAnalysis.iloc[0][['x_rel','y_rel','z_rel']].as_matrix() 
B = dfAnalysis.iloc[1][['x_rel','y_rel','z_rel']].as_matrix() 

我得到以下錯誤:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-11-f153b94e791d> in <module>() 
     7 B = dfAnalysis.iloc[1][['x_rel','y_rel','z_rel']].as_matrix() 
     8 
----> 9 np.cross(A,B) 

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/numpy/core/numeric.py in cross(a, b, axisa, axisb, axisc, axis) 
    1819    cp0 -= tmp 
    1820    multiply(a2, b0, out=cp1) 
-> 1821    multiply(a0, b2, out=tmp) 
    1822    cp1 -= tmp 
    1823    multiply(a0, b1, out=cp2) 

TypeError: ufunc 'multiply' output (typecode 'O') could not be coerced to provided output parameter (typecode 'd') according to the casting rule ''same_kind'' 

如果2個陣列構建這樣的,錯誤的是固定的,但我不明白爲什麼。有人可以解釋嗎?

A = np.array([dfAnalysis.iloc[0]['x_rel'], 
       dfAnalysis.iloc[0]['y_rel'], 
       dfAnalysis.iloc[0]['z_rel']]) 
B = np.array([dfAnalysis.iloc[1]['x_rel'], 
       dfAnalysis.iloc[1]['y_rel'], 
       dfAnalysis.iloc[1]['z_rel']]) 

np.cross(A,B) 

Link to Jupyter Notebook Link to CSV file

回答

1

大熊貓代碼被創建AB與數據類型object代替浮點值的數組作爲numpy的數組:

In [168]: A = df.iloc[0][['x_rel', 'y_rel', 'z_rel']].as_matrix() 

In [169]: A 
Out[169]: array([213.86051031592066, 127.52721826173365, 14.120000000000005], dtype=object) 

object類型的numpy的陣列是一個包含任意python對象的數組。在這種情況下,對象本身就是浮點數值,所以數組大多看起來像浮點數組。但是,許多numpy函數(包括cross)無法處理對象數組。解決這個問題的一種方式是使用astype()方法陣列的數據類型轉換爲numpy.float64

In [170]: a = A.astype(np.float64) 

In [171]: a 
Out[171]: array([ 213.86051032, 127.52721826, 14.12  ]) 

In [172]: b = B.astype(np.float64) 

In [173]: b 
Out[173]: array([ 213.70062319, 127.21119974, 14.12  ]) 

In [174]: np.cross(a, b) 
Out[174]: array([ 4.46218149, -2.25760625, -47.19392108]) 

另一種方法是創建僅使用相關列的陣列:使用as_matrix()

In [193]: rel = df[['x_rel', 'y_rel', 'z_rel']].as_matrix() 

In [194]: rel.dtype 
Out[194]: dtype('float64') 

In [195]: np.cross(rel[0], rel[1]) 
Out[195]: array([ 4.46218149, -2.25760625, -47.19392108]) 
1

直接從導入的csv轉換你的矩陣與dtype對象。

>>> A = dfAnalysis.iloc[0][['x_rel','y_rel','z_rel']].as_matrix() # extract entry as numpy array 
>>> B = dfAnalysis.iloc[1][['x_rel','y_rel','z_rel']].as_matrix() 
>>> A 
array([213.86051031592066, 127.52721826173365, 14.120000000000005], dtype=object) 

變化下方的線,那將其轉換爲float64:

>>> A = pd.to_numeric(dfAnalysis.iloc[0][['x_rel','y_rel','z_rel']]).as_matrix() 
>>> B = pd.to_numeric(dfAnalysis.iloc[1][['x_rel','y_rel','z_rel']]).as_matrix() 
>>> B 
array([ 213.70062319, 127.21119974, 14.12  ])