我有一个相同形状的N个numpy数组列表。我需要按照以下方式将它们组合成一个数组。输出数组的每个元素应该从一个输入数组的相应位置随机取出。
例如,如果我需要决定在位置[2,0,7]使用什么值,我会在所有N个输入数组中取得位于此位置的所有值。所以,我得到N个值,我随机选择一个值。
使它更复杂一点。我想为每个输入数组分配一个概率,以便选择值的概率取决于它是哪个输入数组。
答案 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)