Python 熊猫和努比
我很难做到以下几点。我有一个名为Python 熊猫和努比,python,pandas,numpy,Python,Pandas,Numpy,我很难做到以下几点。我有一个名为p的pandasnxd数据帧,其中缺少一些(NAN)值。我有另一个对应的数组,它的索引是dxkxt。我想把数据框中的每只熊猫的条目n,d映射到a[d][k][p[n,d]]以获得所有可能的k,从而形成n x d x k矩阵。我可以得到一些帮助,如何在熊猫和Numpy图书馆最有效地完成这项工作 实际上,然后我取最终矩阵的nxd部分,沿着列取乘积,留下一个nxk矩阵。最终输出可通过以下方式(缓慢)再现: def generate_entry(i, j):
p
的pandasnxd
数据帧,其中缺少一些(NAN
)值。我有另一个对应的数组,它的索引是dxkxt
。我想把数据框中的每只熊猫的条目n,d
映射到a[d][k][p[n,d]]
以获得所有可能的k,从而形成n x d x k
矩阵。我可以得到一些帮助,如何在熊猫和Numpy图书馆最有效地完成这项工作
实际上,然后我取最终矩阵的nxd
部分,沿着列取乘积,留下一个nxk
矩阵。最终输出可通过以下方式(缓慢)再现:
def generate_entry(i, j):
result = np.prod([alpha[s][j][int(p.loc[i][s])] for s in range(num_features) if not isNaN(p.loc[i][s]) ])
return result
vgenerate_entry = np.vectorize(generate_entry)
result = np.fromfunction(vgenerate_entry, shape=(len(p), k), dtype=int)
我认为使用熊猫玩具会有助于矩阵乘法,但我不太明白这一点
下面的步骤要快得多:
r = None
for i in range(num_features):
rel_data = pd.get_dummies(data.ix[:,i])
rel_probs = alpha[i].T
prod = rel_data.dot(rel_probs)
prod[prod == 0] = 1
if r is None:
r = prod
else:
r = r.multiply(prod)
r = r.as_matrix()
r = r * pi
posteriers = r / np.sum(r, axis=1)[:, np.newaxis]
这里有一种方法可以使用pandas数据帧
p
索引NumPy数组a
,该数据帧具有nan
,这是需要避免的,我们正在这些地方填充一些值fillval
-
def fancy_indexing_avoid_NaNs(p, a, fillval = 1):
# Extract values from p and get NaN mask
pv = p.values
mask = np.isnan(pv)
# Get int version, replacing NaNs with some number, say 0
p_idx = np.where(mask, 0, pv).astype(int)
# FANCY-INDEX into array 'a' with those indices fron p
a_indexed_vals = a[np.arange(D), np.arange(K)[:,None,None],p_idx]
# FANCY-INDEX once more to replace the values set by NaNs as 1s, so
# that in the prod-reduction later on they would have no effect
a_indexed_vals[np.arange(K)[:,None,None],mask] = fillval
return a_indexed_vals
fillval
将取决于应用程序。在本例中,我们使用的是prod
,因此fillval=1
是有意义的,它不会影响结果
OP发布的原始方法-
def generate_entry(i, j):
result = np.prod([a[s][j][int(p.loc[i][s])] for s in range(D) \
if not np.isnan(p.loc[i][s]) ])
return result
vgenerate_entry = np.vectorize(generate_entry)
样本运行-
In [154]: N,D,K,T = 3,4,5,6
...: a = np.random.randint(0,5,(D,K,T))
...:
...: p = pd.DataFrame(np.random.randint(0,T,(N,D)).astype(float))
...: p.iloc[2,3] = np.nan
...: p.iloc[1,2] = np.nan
...:
In [155]: result = np.fromfunction(vgenerate_entry, shape=(len(p), K), dtype=int)
In [156]: a_indexed_vals = fancy_indexing_avoid_NaNs(p, a)
In [157]: out = a_indexed_vals.prod(2).T
In [158]: np.allclose(out, result)
Out[158]: True
是的,只是很慢。你能分享一下吗?您打算如何避免
p
/中的nan?与这些nan相对应的输出必须是什么?如果p[n,d]是nan,则地图应该转到nan。共享循环代码?共享和修改