熊猫和Numpy Fancy Indexing

时间:2017-05-04 16:50:46

标签: python pandas numpy

我正在努力解决以下问题。我有一个名为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]

1 个答案:

答案 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)