创建一个Numpy矩阵来存储输入数组的无序版本

2024-04-23 20:16:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为weights的二维数组,形状(npts,nweights)。对于weights的每个,我希望随机洗牌这些行。我想重复这个过程num_shuffles次,并将洗牌的集合存储到一个名为weights_matrix的3d数组中。重要的是,对于每个洗牌迭代,weights的每一列的洗牌索引应该是相同的。你知道吗

下面是该算法的显式简单的双for循环实现。有没有可能避免python循环并在纯Numpy中生成weights_matrix?你知道吗

import numpy as np 
npts, nweights = 5, 2
weights = np.random.rand(npts*nweights).reshape((npts, nweights))

num_shuffles = 3
weights_matrix = np.zeros((num_shuffles, npts, nweights))
for i in range(num_shuffles):
    indx = np.random.choice(np.arange(npts), npts, replace=False)
    for j in range(nweights):
        weights_matrix[i, :, j] = weights[indx, j]

Tags: infor过程nprangerandom数组matrix
2条回答

这是一个向量化的解决方案,其思想是从^{}借用的-

weights[np.random.rand(num_shuffles,weights.shape[0]).argsort(1)]

样本运行-

In [28]: weights
Out[28]: 
array([[ 0.22508764,  0.8527072 ],
       [ 0.31504052,  0.73272155],
       [ 0.73370203,  0.54889059],
       [ 0.87470619,  0.12394942],
       [ 0.20587307,  0.11385946]])

In [29]: num_shuffles = 3

In [30]: weights[np.random.rand(num_shuffles,weights.shape[0]).argsort(1)]
Out[30]: 
array([[[ 0.87470619,  0.12394942],
        [ 0.20587307,  0.11385946],
        [ 0.22508764,  0.8527072 ],
        [ 0.31504052,  0.73272155],
        [ 0.73370203,  0.54889059]],

       [[ 0.87470619,  0.12394942],
        [ 0.22508764,  0.8527072 ],
        [ 0.73370203,  0.54889059],
        [ 0.20587307,  0.11385946],
        [ 0.31504052,  0.73272155]],

       [[ 0.73370203,  0.54889059],
        [ 0.31504052,  0.73272155],
        [ 0.22508764,  0.8527072 ],
        [ 0.20587307,  0.11385946],
        [ 0.87470619,  0.12394942]]])

您可以先用原始权重的副本填充三维数组,然后对该三维数组的切片执行简单的迭代,使用numpy.random.shuffle将每个二维切片洗牌到位。你知道吗

For every column of weights, I wish to randomly shuffle the rows...the shuffling indices of each column of weights should be the same

这只是说“我想随机地重新排列二维数组的行”的另一种方式。numpy.random.shufflerandom.shuffle的一个支持numpy数组的版本:它将对容器的元素进行适当的重新排序。这就是你所需要的,因为二维numpy数组的“元素”,在这个意义上,就是它的行。你知道吗

import numpy
weights = numpy.array( [ [ 1, 2, 3 ], [ 4, 5, 6], [ 7, 8, 9 ] ] )
weights_3d = weights[ numpy.newaxis, :, : ].repeat( 10, axis=0 )

for w in weights_3d:
    numpy.random.shuffle( w )  # in-place shuffle of the rows of each slice

print( weights_3d[0, :, :] )
print( weights_3d[1, :, :] )
print( weights_3d[2, :, :] )

相关问题 更多 >