从NumPy数组中随机选择单元格-不替换

2024-04-27 02:36:19 发布

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


Tags: python
3条回答

所有这些答案对我来说都有点复杂。

我假设您有一个多维数组,您希望从中生成一个索引的详尽列表。您希望对这些索引进行无序排列,这样就可以按随机顺序访问每个数组元素。

以下代码将以简单而直接的方式执行此操作:

#!/usr/bin/python
import numpy as np

#Define a two-dimensional array
#Use any number of dimensions, and dimensions of any size
d=numpy.zeros(30).reshape((5,6))

#Get a list of indices for an array of this shape
indices=list(np.ndindex(d.shape))

#Shuffle the indices in-place
np.random.shuffle(indices)

#Access array elements using the indices to do cool stuff
for i in indices:
  d[i]=5

print d

打印d已验证所有元素都已被访问。

请注意,数组可以有任意数量的维度,维度可以是任意大小。

这种方法的唯一缺点是,如果d很大,那么indices可能会变得相当大。因此,最好有一个生成器。遗憾的是,我无法独立地考虑如何构建一个经过洗牌的迭代器。

从@WoLpH扩展好的答案

对于一个2D数组,我认为它将取决于你想知道或需要知道什么样的索引。

你可以这样做:

data = np.arange(25).reshape((5,5))

x, y  = np.where( a = a)
idx = zip(x,y)
np.random.shuffle(idx)

data = np.arange(25).reshape((5,5))

grid = np.indices(data.shape)
idx = zip( grid[0].ravel(), grid[1].ravel() )
np.random.shuffle(idx)

然后,可以使用列表idx在任意顺序的2D数组索引上迭代,并从保持不变的data中获取该索引处的值。

注意:您也可以通过itertools.product生成随机顺序的索引,以防您对这组工具更熟悉。

如果仍然需要原始数组,那么使用numpy.random.shufflenumpy.random.permutation怎么样?

如果需要就地更改数组,则可以创建如下索引数组:

your_array = <some numpy array>
index_array = numpy.arange(your_array.size)
numpy.random.shuffle(index_array)

print your_array[index_array[:10]]

相关问题 更多 >