我来自java背景,是numpy和pandas的新手。 我想将以下伪代码翻译成python。
theta[0...D] - numpy
input[1...D][0...N-1] - Pandas data frame
PSEUDO CODE:
mean = theta[0]
for(row = 0 to N-1)
for(col = 1 to D)
mean += theta[col] * input[row][col]
实现:
class simulator:
theta = np.array([])
stddev = 0
def __init__(self, v_coefficents, v_stddev):
self.theta = v_coefficents
self.stddev = v_stddev
def sim( self, input ):
mean = self.theta[0]
D = input.shape[0]
N = input.shape[1]
for index, row in input.iterrows():
mean = self.theta[0]
for i in range(D):
mean += self.theta[i+1] *row['y']
我关注最后一行代码中的迭代:
mean += self.theta[i+1] *row['y']
。
答案 0 :(得分:3)
由于您正在使用NumPy,我建议将pandas数据帧作为数组提取,然后我们可以使用theta
和提取的input
版本作为数组。< / p>
因此,从我们开始,我们将数组作为 -
input_arr = input.values
然后,伪代码的翻译将是 -
mean = theta[0]
for row in range(N):
for col in range(1,D+1):
mean += theta[col] * input_arr[row,col]
要执行总和减少,NumPy支持向量化操作和broadcasting
,我们只需输出 -
mean = theta[0] + (theta[1:D+1]*input_arr[:,1:D+1]).sum()
这可以通过np.dot
作为矩阵乘法进一步优化,如此 -
mean = theta[0] + np.dot(input_arr[:,1:D+1], theta[1:D+1]).sum()
请注意,如果您认为input
的长度为D-1
,那么我们需要进行少量修改:
input_arr[row,col-1]
而不是input_arr[row,col]
。input_arr
而不是input_arr[:,1:D+1]
。基于comments
-
In [71]: df = {'y' : [1,2,3,4,5]}
...: data_frame = pd.DataFrame(df)
...: test_coefficients = np.array([1,2,3,4,5,6])
...:
In [79]: input_arr = data_frame.values
...: theta = test_coefficients
...:
In [80]: theta[0] + np.dot(input_arr[:,0], theta[1:])
Out[80]: 71