Python 从矩阵和向量中选择相应的k行

Python 从矩阵和向量中选择相应的k行,python,Python,我有一个矩阵X(形状mXn)和向量y(形状mX1)和概率向量p(形状mX1) 我想根据概率p对X中的k行和y中的对应行进行采样 我如何在python中实现这一点(例如,是否有任何内置函数已经实现了这一点?您需要使用累积分布函数(使用numpy或编写自己的函数),并将向量压缩在一起以实现您想要实现的目标 实施 def sample(population, k, prob = None): import random from bisect import bisect fro

我有一个矩阵
X(形状mXn)
和向量
y(形状mX1)
和概率向量
p(形状mX1)

我想根据概率p对X中的k行和y中的对应行进行采样


我如何在python中实现这一点(例如,是否有任何内置函数已经实现了这一点?

您需要使用累积分布函数(使用numpy或编写自己的函数),并将向量压缩在一起以实现您想要实现的目标

实施

def sample(population, k, prob = None):
    import random
    from bisect import bisect
    from operator import itemgetter
    def cdf(population, k, prob):
        population = map(itemgetter(1), sorted(zip(prob, population)))
        _cumm = [prob[0]]
        for i in range(1, len(P)):
            _cumm.append(_cumm[-1] + P[i])
        return [population[bisect(_cumm, random.random())] for i in range(k)]
    if prob == None:
        return  random.sample(population, k)
    else:
        return cdf(population, k, prob)
示例

def gen_sample_data(m, n):
    X = [random.sample(range(100), n) for _ in range(m)]
    Y = random.sample(range(100), m)
    P = random.sample(range(100), m)
    P = [1. * e/sum(P) for e in P]
    return X, Y, P


>>> X, Y, P = gen_sample_data(10, 5)
>>> pprint.pprint(X)
[[29, 14, 95, 4, 83],
 [80, 73, 34, 70, 49],
 [67, 25, 94, 46, 83],
 [78, 24, 80, 38, 91],
 [90, 22, 53, 20, 71],
 [91, 0, 64, 90, 59],
 [82, 66, 22, 33, 93],
 [25, 34, 7, 5, 2],
 [87, 0, 91, 8, 78],
 [17, 30, 73, 14, 63]]
>>> pprint.pprint(Y)
[83, 61, 62, 59, 41, 72, 56, 23, 36, 97]
>>> pprint.pprint(P)
[0.015424164524421594,
 0.002570694087403599,
 0.2544987146529563,
 0.02570694087403599,
 0.10796915167095116,
 0.033419023136246784,
 0.08483290488431877,
 0.20565552699228792,
 0.2236503856041131,
 0.04627249357326478]
>>> pprint.pprint(zip(*sample(zip(X,Y), 5, prob = P)))
[([67, 25, 94, 46, 83],
  [87, 0, 91, 8, 78],
  [82, 66, 22, 33, 93],
  [87, 0, 91, 8, 78],
  [87, 0, 91, 8, 78]),
 (62, 36, 56, 36, 36)]

在(1,len(P))范围内是否有i的拼写错误:P是什么?是的,这是一个印刷错误。这应该是个问题