我正在努力解决以下问题。我有一个名为N x D
的pandas p
数据框,其中包含一些缺失(NAN
)值。我有另一个由D x K x T
索引的相应数组。我想将数据框中每个熊猫的条目n,d
映射到a[d][k][p[n,d]]
,以获得所有可能的k,从而生成N x D x K
矩阵。关于如何使用Pandas和Numpy库最有效地完成这项工作,我能获得一些帮助吗?
然后,我实际上取最终矩阵的N x D
部分,沿着列取出产品,留下N x K
矩阵。最终输出可以(慢慢地)通过以下方式再现:
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)
我认为使用pandas.get_dummies
会对矩阵乘法有所帮助,但我无法理解这一点。
以下内容要快得多:
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]
答案 0 :(得分:3)
这是使用具有a
的pandas数据帧p
索引NumPy数组NaNs
的一种方法,这些方法需要避免,我们正在填充一些值{ {1}}在那些地方 -
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
有意义,这不会影响结果。
OP发布的原始方法 -
fillval=1
示例运行 -
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)