如何在Numpy中随机混合N个数组?

时间:2017-07-02 07:07:42

标签: python arrays numpy random

我有一个相同形状的N个numpy数组列表。我需要按照以下方式将它们组合成一个数组。输出数组的每个元素应该从一个输入数组的相应位置随机取出。

例如,如果我需要决定在位置[2,0,7]使用什么值,我会在所有N个输入数组中取得位于此位置的所有值。所以,我得到N个值,我随机选择一个值。

使它更复杂一点。我想为每个输入数组分配一个概率,以便选择值的概率取决于它是哪个输入数组。

2 个答案:

答案 0 :(得分:0)

import numpy as np
import itertools as it

x = np.random.choice(np.arange(10), (2,3,4))  # pass probabilities with p=...
N = 10
a = [k*np.ones_like(x) for k in range(N)]  # list of N arrays of same shape
y = np.empty(a[0].shape)  # output array

# Generate list of all indices of arrays in a (no matter what shape, this is
# handled with *) and set elements of output array y.
for index in list(it.product(*list(np.arange(n) for n in x.shape))):
    y[index] = a[x[index]][index]
# a[x[index]] is the array chosen at a given index.
# a[x[index]][index] is the element of this array at the given index.

# expected result with the choice of list a: x==y is True for all elements

更复杂的部分"应使用numpy.random.choice的参数p进行处理。其他任何内容都应该在评论中解释。使用*这应该适用于a中任意形状的数组(我希望)。

答案 1 :(得分:0)

让我们只使用numpy内置的ins来处理它:它会比for循环更快。

Team

如果你想拥有不同的概率,可以将参数p传递给np.random.choice(形状(N,)的数组,必须总和为1):

import numpy as np

# N = 3 dummy arrays for the example
a = np.zeros([4, 5])
b = 10 * np.ones([4, 5])
c = 2 * b

arr = np.array([a, b, c])  # this is a 3D array containing your N arrays
N = arr.shape[0]

idx = np.random.choice(range(N), 4 * 5)  # 4 and 5 are the common dimensions of your N arrays

# treating this a a 1D problem, but treating as 2D is possible too.
arr.reshape(N, 20)[idx.ravel(), np.arange(20)].reshape(4, 5)

这给出了:

idx_p = np.random.choice(range(n_arr), 4 * 5, p = [0.1, 0.2, 0.7])
arr.reshape(n_arr, 20)[idx_p.ravel(), np.arange(20)].reshape(4, 5)