Python 如何替换numpy中的轴参数

Python 如何替换numpy中的轴参数,python,numpy,Python,Numpy,我的代码如下 np.array([points[label==k]。范围内k的平均值(axis=0)(self.k)]) Points是一个n x d数组,label是一个1 x n数组,最大值为k,k是一个数字 我的目标是删除axis参数,并且仍然得到相同的结果,还有数组part label==k的索引,我想重写 你们当中有人有这样做的方法吗 我猜你在寻找一个矢量化的解决方案。这里有一个是矩阵乘法- def matmul(points, label): k = label.max()

我的代码如下

np.array([points[label==k]。范围内k的平均值(axis=0)(self.k)])
Points是一个n x d数组,label是一个1 x n数组,最大值为k,k是一个数字

我的目标是删除axis参数,并且仍然得到相同的结果,还有数组part label==k的索引,我想重写


你们当中有人有这样做的方法吗

我猜你在寻找一个矢量化的解决方案。这里有一个是矩阵乘法-

def matmul(points, label):
    k = label.max()+1
    mask = label == np.arange(k)[:,None]
    out = mask.dot(points)/mask.sum(1,keepdims=True)
    return out
下面是另一个带有
np.add.reduceat
-

def add_reduceat(points, label):
    k = label.max()+1
    sidx = label.argsort()
    ps = points[sidx]
    ls = label[sidx]

    cutidx = np.flatnonzero(np.r_[True,ls[:-1] != ls[1:],True])
    lens = np.diff(cutidx)
    out = np.full((k,points.shape[1]),np.nan)

    idx_rows = ls[cutidx[:-1]]
    mean_vals = np.add.reduceat(ps,cutidx[:-1],axis=0)/lens[:,None]
    out[idx_rows] = mean_vals
    return out
样本运行-

In [220]: n,d,k = 10000,100,100
     ...: np.random.seed(0)
     ...: points = np.random.rand(n,d)
     ...: label = np.random.randint(0,k,(n))

In [221]: out0 = np.array([points[label==k_i].mean(axis = 0) for k_i in range(k)])

In [222]: np.allclose(matmul(points, label),out0)
Out[222]: True

In [223]: np.allclose(add_reduceat(points, label),out0)
Out[223]: True

这些是一些很好的解决方案,我非常喜欢面具选项!它在numpy中工作得非常好。我是numpy的叉子还没有实现keepdims,有没有办法不实现它?@Shadesfear是的,只需使用
mask.sum(1)[:,None]
替换
mask.sum(1,keepdims=True)
。谢谢!那太好了,你有什么我可以读的关于如何编写我自己的矢量化代码的材料吗?@Shadesfear-well矢量化是一个非常广泛的话题。我只是建议按照这里的矢量化问题。目前无法建议任何外部参考。