用python洗牌数组最简单的方法是什么?
其他的答案是最简单的,但它是有点烦人的随机。Shuffle方法实际上并不返回任何东西——它只是对给定的列表进行排序。如果你想链式调用,或者只是能够在一行中声明一个洗牌数组,你可以这样做:
import random
def my_shuffle(array):
random.shuffle(array)
return array
然后你可以这样做:
for suit in my_shuffle(['hearts', 'spades', 'clubs', 'diamonds']):
当处理常规的Python列表时,random.shuffle()将完成工作,就像前面的答案所显示的那样。
但当涉及到ndarray(numpy.array)时,随机。Shuffle似乎破坏了原始ndarray。这里有一个例子:
import random
import numpy as np
import numpy.random
a = np.array([1,2,3,4,5,6])
a.shape = (3,2)
print a
random.shuffle(a) # a will definitely be destroyed
print a
只需使用:np.random.shuffle(a)
像随机的。Shuffle, np.random.shuffle原地打乱数组。
除了前面的回复,我想介绍另一个功能。
numpy。random。shuffle和random。进行原地洗牌。但是,如果你想返回一个打乱的数组,可以使用numpy.random.permutation函数。
我不知道我使用了random。shuffle(),但它返回'None'给我,所以我写了这个,可能对别人有帮助
def shuffle(arr):
for n in range(len(arr) - 1):
rnd = random.randint(0, (len(arr) - 1))
val1 = arr[rnd]
val2 = arr[rnd - 1]
arr[rnd - 1] = val1
arr[rnd] = val2
return arr
如果你想要一个新的数组,你可以使用sample:
import random
new_array = random.sample( array, len(array) )
另一种方法是使用sklearn
from sklearn.utils import shuffle
X=[1,2,3]
y = ['one', 'two', 'three']
X, y = shuffle(X, y, random_state=0)
print(X)
print(y)
输出:
[2, 1, 3]
['two', 'one', 'three']
优点:可以同时随机多个数组,而不会中断映射。'random_state'可以控制可复制行为的变换。
你可以用随机键对数组排序
sorted(array, key = lambda x: random.random())
键只读取一次,所以在排序期间比较项目仍然有效。
但看起来random.shuffle(array)会更快,因为它是用C写的
顺便说一下,这是O(Nlog(N)
# 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]
注意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左右。
推荐文章
- 如何在Python中进行热编码?
- 如何嵌入HTML到IPython输出?
- 在Python生成器上使用“send”函数的目的是什么?
- 是否可以将已编译的.pyc文件反编译为.py文件?
- Django模型表单对象的自动创建日期
- 在Python中包装长行
- 如何计算两个时间串之间的时间间隔
- 我如何才能找到一个Python函数的参数的数量?
- 您可以使用生成器函数来做什么?
- 将Python诗歌与Docker集成
- 提取和保存视频帧
- 使用请求包时出现SSL InsecurePlatform错误
- 如何检索Pandas数据帧中的列数?
- except:和except的区别:
- 错误:“字典更新序列元素#0的长度为1;2是必需的”