2015-05-29 22 views
1

我一直試圖讓numpy.piecewise將一系列{a_ij}轉換成分段三次多項式。每當我運行下面的代碼,np.piecewise()使用math.pow()進行動作?

import math 
import numpy as np 

x = np.linspace(0.1,9.9,100) 
a = [[i] * 4 for i in range(10)] 
x_i = [0,1,2,3,4,5,6,7,8,9,10] 
condlist = [(x[i] < x)*(x<x_i[i+1]) for i in range(len(x_i)-1)] 
funclist = [lambda y: sum([a[k][j] * math.pow(y - x_i[k],j) for j in range(4)]) for k in range(len(a))] 
print np.piecewise(x, condlist, funclist) 

我得到的錯誤

...line 730, in piecewise 
y[condlist[k]] = item(vals, *args, **kw) 
File "test", line 8, in <lambda> 
funclist = [lambda y: sum([a[k][j] * math.pow(y - x_i[k],j) for j in range(4)]) for k in range(len(a))] 
TypeError: only length-1 arrays can be converted to Python scalars 

錯誤消失,但是,當且僅當我擺脫math.pow的()。出於某種原因,funclist將x傳遞給math.pow()會破壞一切。

發生了什麼事?我怎樣才能解決這個問題?

+0

一般來說,您不應該將'numpy'與Python的內置函數混合使用,因爲它們不是爲了配合而構建的。你正在使用np.linspace和np.piecewise以及Python的sum,math.pow和list。我不確定究竟是什麼破壞了你的代碼,但我非常肯定這是由於這個原因造成的。 – Frxstrem

回答

3

math模塊中的函數需要數字標量作爲參數。他們不期望NumPy陣列。 funclist中的函數正在傳遞一個NumPy數組,y。 所以math.pow(y-constant, j)是提高一個類型錯誤:

In [22]: y = np.arange(5) 
In [31]: math.pow(y - 1, 2) 
TypeError: only length-1 arrays can be converted to Python scalars 

使用np.power而不是math.pow

funclist = [lambda y: ([a[k][j] * np.power(y - x_i[k],j) for j in range(4)]).sum() 
      for k in range(len(a))] 

注:不是使用Python sum功能,你也應該調用NumPy的sum方法獲得更好的性能。