【问题标题】:Complex indexing without loop无循环的复杂索引
【发布时间】:2019-01-21 03:58:54
【问题描述】:

我有一个 Nx5 维度的数组。最后 3 个维度是不同体积的 x、y 和 z。然后将它们打包到其他两个维度中。例如:

[[0 0 x0 y0 z0],
[0 0 x1 y1 z1],
[0 0 x2 y2 z2],
[0 1 x3 y3 z3],
[0 1 x4 y4 z4],
[1 0 x5 y5 z5],
[1 0 x6 y6 z6],
[1 1 x7 y7 z7],
[1 1 x8 y8 z8],
[2 0 x9 y9 z9],
[2 0 x10 y10 z10],
[2 0 x11 y11 z11],
[2 1 x12 y12 z12]]

前两个维度的卷数每次都不同。我想计算每个维度中每个体积的 x、y 和 z 的平均值。这应该会导致这样的结果:

[[0 0 xmean0 ymean0 zmean0],
[0 1 xmean1 ymean1 zmean1],
[1 0 xmean2 ymean2 zmean2],
[1 1 xmean3 ymean3 zmean3]]
[2 0 xmean4 ymean4 zmean4],
[2 1 xmean5 ymean5 zmean5]]

换句话说,它应该具有每个第一个元素组合的平均值。我不能为此使用循环,只能使用 numpy 和/或 tensorflow。

【问题讨论】:

    标签: python-3.x numpy indexing mean


    【解决方案1】:

    我们假设输入数组是a

    方法#1:使用bincount -

    unq_comb,ids, w = np.unique(a[:,:2], axis=0, return_inverse=1, return_counts=1)
    out = np.empty((len(unq_comb),5))
    out[:,:2] = unq_comb
    for i in [2,3,4]:
        out[:,i] = np.bincount(ids, a[:,i])/w
    

    方法 #2: 使用 sorting -

    sidx = np.lexsort(a[:,:2].T)
    b = a[sidx]
    idx = np.flatnonzero(np.r_[True,(b[:-1,:2] != b[1:,:2]).any(1),True])
    w = np.diff(idx)[:,None].astype(float)
    out = np.empty((len(unq_comb),5))
    out[:,:2] = b[idx[:-1],:2]
    out[:,2:] = np.add.reduceat(b[:,2:], idx[:-1], axis=0)/w
    

    【讨论】:

    • 感谢您的回复!遗憾的是我不能使用第一个,因为我不能使用循环。第二个效果很好,但是由于 lexsort,我在将其实现到 tensorflow 时遇到了一些麻烦:S 有什么建议吗?
    • @FelipeMoser 不要因为不使用循环而挂断电话。 Bincount 非常高效,我们只是在那里循环了 3 次迭代。
    • 感谢您的回复。可悲的是,这是我对这个特定项目的限制的一部分:(
    • 嘿!遗憾的是,最后我为我的具体问题选择了另一种解决方案,您可以在这里找到:stackoverflow.com/questions/51724450/…
    • @FelipeMoser 这看起来是一个完全不同的问题。但是,很好,你有你的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2021-11-18
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    相关资源
    最近更新 更多