gpt4 book ai didi

python - Pandas 和 Numpy 花式索引

转载 作者:太空宇宙 更新时间:2023-11-04 00:36:41 25 4
gpt4 key购买 nike

我遇到了以下问题。我有一个名为 p 的 pandas N x D 数据框,其中缺少一些 (NAN) 值。我有另一个由 D x K x T 索引的相应数组。我想将数据框中每个 Pandas 的条目 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]

最佳答案

这是一种使用具有 NaNs 的 pandas 数据帧 p 索引到 NumPy 数组 a 的方法,这是要避免的,我们在那些地方填充一些值 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)

sample 运行-

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

关于python - Pandas 和 Numpy 花式索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43788676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com