Python 如何从2d np数组和np概率数组中选择随机行?

Python 如何从2d np数组和np概率数组中选择随机行?,python,arrays,numpy,Python,Arrays,Numpy,我在从np数组中选择随机行(在我的例子中是点)时遇到一些困难。我想用每个点的概率(所以我有一个P_I np数组,其中每一行都是一个点的概率)。我试着用np.random.choice来做,得到“它必须是一个一维数组”,所以我对行数做了np.random.choice,得到了行的随机索引。但是我如何用每个点的概率来计算呢?你可以使用概率分布为1的np.choice 得到的概率总和为1 重塑 如果您的概率总和已达到1,则您只需压缩概率向量: # Example of probability vect

我在从np数组中选择随机行(在我的例子中是点)时遇到一些困难。我想用每个点的概率(所以我有一个P_I np数组,其中每一行都是一个点的概率)。我试着用np.random.choice来做,得到“它必须是一个一维数组”,所以我对行数做了np.random.choice,得到了行的随机索引。但是我如何用每个点的概率来计算呢?

你可以使用概率分布为1的np.choice

得到的概率总和为1 重塑 如果您的概率总和已达到
1
,则您只需压缩概率向量:

# Example of probability vector
probs = np.array([[0.1, 0.2, 0.5, 0.2]])
# array([[0.1, 0.2, 0.5, 0.2]])
probs.shape
# > (1, 4)
p_squeezed = probs.squeeze()
# > array([0.1, 0.2, 0.5, 0.2])
p_squeezed.shape
# > (4,)
获得适当的概率分布 如果您自己的
probs
加起来不等于1,则您可以应用
除以总和
softmax

只是生成随机数据:

import numpy as np
# Random 2D points
points = np.random.randint(0,10, size=(10,2))
# random independant probabilities
probs = np.random.rand(10).reshape(-1, 1)
data = np.hstack((probs, points))
print(data)
# > array([[0.01402932, 5.        , 5.        ],
#          [0.01454579, 5.        , 6.        ],
#          [0.43927214, 1.        , 7.        ],
#          [0.36369286, 3.        , 7.        ],
#          [0.09703463, 9.        , 9.        ],
#          [0.56977406, 1.        , 4.        ],
#          [0.0453545 , 4.        , 2.        ],
#          [0.70413767, 4.        , 4.        ],
#          [0.72133774, 7.        , 1.        ],
#          [0.27297051, 3.        , 6.        ]])
应用softmax:

from scipy.special import softmax
scale_softmax = softmax(data[:,0])
# > array([0.07077797, 0.07081454, 0.1082876 , 0.10040494, 0.07690364,
#  0.12338291, 0.0730302 , 0.14112644, 0.14357482, 0.09169694])
应用总和除法:

scale_divsum = data[: ,0] / data[:, 0].sum()
# > array([0.00432717, 0.00448646, 0.13548795, 0.11217647, 0.02992911,
#  0.17573962, 0.01398902, 0.21718238, 0.22248752, 0.08419431])
以下是我提出的标度函数的累积分布:

Softmax
使它比
除以总和更容易选择任何一点,但后者可能更适合您的需要

随机选取一行 现在,您可以使用
np.random.choice
并将概率分布赋给参数
p

rand_idx = np.random.choice(np.arange(len(data)), p=scale_softmax)
data[rand_idx]
# > array([0.70413767, 4.        , 4.        ])

# or just the point:
data[rand_idx, 1:]
# > array([4., 4.])

您可以使用np.choice,其概率分布总和为1

得到的概率总和为1 重塑 如果您的概率总和已达到
1
,则您只需压缩概率向量:

# Example of probability vector
probs = np.array([[0.1, 0.2, 0.5, 0.2]])
# array([[0.1, 0.2, 0.5, 0.2]])
probs.shape
# > (1, 4)
p_squeezed = probs.squeeze()
# > array([0.1, 0.2, 0.5, 0.2])
p_squeezed.shape
# > (4,)
获得适当的概率分布 如果您自己的
probs
加起来不等于1,则您可以应用
除以总和
softmax

只是生成随机数据:

import numpy as np
# Random 2D points
points = np.random.randint(0,10, size=(10,2))
# random independant probabilities
probs = np.random.rand(10).reshape(-1, 1)
data = np.hstack((probs, points))
print(data)
# > array([[0.01402932, 5.        , 5.        ],
#          [0.01454579, 5.        , 6.        ],
#          [0.43927214, 1.        , 7.        ],
#          [0.36369286, 3.        , 7.        ],
#          [0.09703463, 9.        , 9.        ],
#          [0.56977406, 1.        , 4.        ],
#          [0.0453545 , 4.        , 2.        ],
#          [0.70413767, 4.        , 4.        ],
#          [0.72133774, 7.        , 1.        ],
#          [0.27297051, 3.        , 6.        ]])
应用softmax:

from scipy.special import softmax
scale_softmax = softmax(data[:,0])
# > array([0.07077797, 0.07081454, 0.1082876 , 0.10040494, 0.07690364,
#  0.12338291, 0.0730302 , 0.14112644, 0.14357482, 0.09169694])
应用总和除法:

scale_divsum = data[: ,0] / data[:, 0].sum()
# > array([0.00432717, 0.00448646, 0.13548795, 0.11217647, 0.02992911,
#  0.17573962, 0.01398902, 0.21718238, 0.22248752, 0.08419431])
以下是我提出的标度函数的累积分布:

Softmax
使它比
除以总和更容易选择任何一点,但后者可能更适合您的需要

随机选取一行 现在,您可以使用
np.random.choice
并将概率分布赋给参数
p

rand_idx = np.random.choice(np.arange(len(data)), p=scale_softmax)
data[rand_idx]
# > array([0.70413767, 4.        , 4.        ])

# or just the point:
data[rand_idx, 1:]
# > array([4., 4.])
请阅读和阅读。显示代码和完整的错误跟踪。如果所需的API不支持多维数组,则始终可以
.flant()
将数组转换为1D…请阅读并重试。显示代码和完整的错误跟踪。如果所需的API不支持多维数组,则始终可以
.flant()
将数组转换为1D。。。