用python洗牌数组最简单的方法是什么?
当前回答
注意random.shuffle()不应该用于多维数组,因为它会导致重复。
假设你想要沿着数组的第一个维度洗牌,我们可以创建以下测试示例,
import numpy as np
x = np.zeros((10, 2, 3))
for i in range(10):
x[i, ...] = i*np.ones((2,3))
沿着第一个轴,第i个元素对应于一个2x3矩阵其中所有的元素都等于i。
如果我们对多维数组使用正确的洗牌函数,即np.random.shuffle(x),数组将按照需要沿着第一个轴洗牌。但是,使用random.shuffle(x)将导致重复。你可以在洗牌后运行len(np.unique(x))来检查这一点,使用np.random.shuffle()会得到10(正如预期的那样),但使用random.shuffle()时只有5左右。
其他回答
你可以用随机键对数组排序
sorted(array, key = lambda x: random.random())
键只读取一次,所以在排序期间比较项目仍然有效。
但看起来random.shuffle(array)会更快,因为它是用C写的
顺便说一下,这是O(Nlog(N)
其他的答案是最简单的,但它是有点烦人的随机。Shuffle方法实际上并不返回任何东西——它只是对给定的列表进行排序。如果你想链式调用,或者只是能够在一行中声明一个洗牌数组,你可以这样做:
import random
def my_shuffle(array):
random.shuffle(array)
return array
然后你可以这样做:
for suit in my_shuffle(['hearts', 'spades', 'clubs', 'diamonds']):
注意random.shuffle()不应该用于多维数组,因为它会导致重复。
假设你想要沿着数组的第一个维度洗牌,我们可以创建以下测试示例,
import numpy as np
x = np.zeros((10, 2, 3))
for i in range(10):
x[i, ...] = i*np.ones((2,3))
沿着第一个轴,第i个元素对应于一个2x3矩阵其中所有的元素都等于i。
如果我们对多维数组使用正确的洗牌函数,即np.random.shuffle(x),数组将按照需要沿着第一个轴洗牌。但是,使用random.shuffle(x)将导致重复。你可以在洗牌后运行len(np.unique(x))来检查这一点,使用np.random.shuffle()会得到10(正如预期的那样),但使用random.shuffle()时只有5左右。
import random
random.shuffle(array)
# arr = numpy array to shuffle
def shuffle(arr):
a = numpy.arange(len(arr))
b = numpy.empty(1)
for i in range(len(arr)):
sel = numpy.random.random_integers(0, high=len(a)-1, size=1)
b = numpy.append(b, a[sel])
a = numpy.delete(a, sel)
b = b[1:].astype(int)
return arr[b]
推荐文章
- Python 3.7数据类中的类继承
- 如何在PyTorch中初始化权重?
- 计数唯一的值在一列熊猫数据框架像在Qlik?
- 使用Pandas将列转换为行
- 从matplotlib中的颜色映射中获取单个颜色
- Javascript reduce()在对象
- 将Pandas或Numpy Nan替换为None以用于MysqlDB
- 使用pandas对同一列进行多个聚合
- 使用Python解析HTML
- django MultiValueDictKeyError错误,我如何处理它
- 如何在for循环期间修改列表条目?
- Java数组有最大大小吗?
- [].slice的解释。调用javascript?
- 我如何在Django中创建一个鼻涕虫?
- 数组与列表的性能