簡體   English   中英

在計算叉積時,為什么.as_matrix()調用會導致錯誤?

[英]Why is the .as_matrix() call causing an error while computing the cross product?

誰能闡明為什么此數組值分配會導致numpy.cross()錯誤?

假設dfAnalysis是一個熊貓數據框,其中包含x_rel,y_rel和z_rel作為列標簽,並以float值作為其數據類型條目。

像下面的代碼片段一樣從中提取數據時...

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''

如果兩個數組是這樣構建的,則錯誤已修復,但是我不明白為什么。 有人可以解釋嗎?

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)

鏈接到Jupyter Notebook 鏈接到CSV文件

熊貓代碼正在將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])

一種替代方法是僅使用相關列來創建數組:

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])

直接從導入的csv使用as_matrix()使用as_matrix()對象轉換矩陣。

>>> 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      ])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM