【发布时间】:2017-01-16 20:31:21
【问题描述】:
我正在尝试置换由具有混合类型元素的子列表组成的列表:
import numpy as np
a0 = ['122', 877.503017, 955.471176, [21.701201, 1.315585]]
a1 = ['176', 1134.076908, 1125.504758, [19.436181, 0.9987899]]
a2 = ['177', 1038.686843, 1018.987868, [19.539959, 1.183997]]
a3 = ['178', 878.999081, 1022.050447, [19.6448771, 1.1867719]]
a = [a0, a1, a2, a3]
b = np.random.permutation(a)
这将失败:
ValueError: cannot set an array element with a sequence
是否有内置函数可以让我生成这样的排列?
我需要生成一个随机排列,我并不是要获得所有可能的排列。
我检查了三个答案:
import time
import random
# np.random.permutation()
start = time.time()
for _ in np.arange(100000):
b = np.random.permutation([np.array(i, dtype='object') for i in a])
print(time.time() - start)
# np.random.shuffle()
start = time.time()
for _ in np.arange(100000):
b = a[:]
np.random.shuffle(b)
print(time.time() - start)
# random.shuffle()
start = time.time()
for _ in np.arange(100000):
random.shuffle(a)
print(time.time() - start)
结果是:
1.47580695152
0.11471414566
0.26300907135
所以np.random.shuffle() 解决方案比np.random.permutation() 快大约10 倍,比random.shuffle() 快2 倍。
【问题讨论】:
-
您是尝试生成列表的随机排列,还是获取所有排列?
-
只是一个随机排列。我会将此信息添加到问题中。
-
这是一种非常奇怪的 NumPy 使用方式。如果您想尝试使用 NumPy 构建这样的数据结构,您将不得不处理很多尴尬和低效率的问题。
-
很可能就是这样。或许使用下面建议的
random包会更有效。
标签: python numpy permutation