Numpy随机选择不适用于二维列表

jbose2ul  于 2023-08-05  发布在  其他
关注(0)|答案(5)|浏览(162)

运行以下Python代码:

import numpy as np
a_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 1, 2]]
np.random.choice(a_list, size=20, 
    replace=True)

字符串
期待这样的结果:

[[7, 8, 9], [1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 1, 2], [1, 2, 3], [1, 2, 3], [10, 1, 2], [1, 2, 3], [7, 8, 9], [1, 2, 3], [1, 2, 3], [10, 1, 2], [4, 5, 6], [4, 5, 6], [10, 1, 2], [10, 1, 2], [7, 8, 9], [1, 2, 3], [7, 8, 9]]


但我得到的是下面的错误消息:

ValueError                           Traceback (most recent call last)
 <ipython-input-80-c11957aca587> in <module>()
    2 a_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 1, 2]]
    3 np.random.choice(a_list, size=20, 
----> 4 replace=True)

mtrand.pyx in mtrand.RandomState.choice()

ValueError: a must be 1-dimensional


如何从二维列表中随机选择?

iqih9akk

iqih9akk1#

您需要使用索引:

import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 1, 2]])
indices = np.arange(arr.shape[0])

output = arr[np.random.choice(indices, 20)]

字符串
或者,更短(基于hpaulj的评论):

output = arr[np.random.choice(arr.shape[0],20)]

2sbarzqh

2sbarzqh2#

Numpy不知道你想从矩阵中提取一个随机行还是一个随机单元。这就是为什么它只适用于一维数据。
你可以使用random.choice

>>> import random
>>> a_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 1, 2]]
>>> [random.choice(a_list) for _ in range(20)]
[[4, 5, 6], [7, 8, 9], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [4, 5, 6], [4, 5, 6], [1, 2, 3], [10, 1, 2], [10, 1, 2], [4, 5, 6], [1, 2, 3], [1, 2, 3], [1, 2, 3], [10, 1, 2], [4, 5, 6], [1, 2, 3], [4, 5, 6], [4, 5, 6]]

字符串
使用Python 3.6或更高版本,您可以直接使用random.choices

>>> random.choices(a_list, k=20)
[[10, 1, 2], [7, 8, 9], [4, 5, 6], [10, 1, 2], [1, 2, 3], [1, 2, 3], [10, 1, 2], [10, 1, 2], [1, 2, 3], [7, 8, 9], [10, 1, 2], [10, 1, 2], [7, 8, 9], [4, 5, 6], [7, 8, 9], [4, 5, 6], [1, 2, 3], [4, 5, 6], [7, 8, 9], [7, 8, 9]]


如果你真的想使用一个numpy数组,你必须将你的列表列表转换为一个1-D array of objects.

e5nszbig

e5nszbig3#

或者可以执行map

print(list(map(lambda x: random.choice(a_list),range(20))))

字符串

Demo:

import random
a_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 1, 2]]
print(list(map(lambda x: random.choice(a_list),range(20))))


输出量:

[[7, 8, 9], [10, 1, 2], [4, 5, 6], [10, 1, 2], [4, 5, 6], [10, 1, 2], [7, 8, 9], [4, 5, 6], [7, 8, 9], [1, 2, 3], [7, 8, 9], [1, 2, 3], [1, 2, 3], [10, 1, 2], [10, 1, 2], [10, 1, 2], [4, 5, 6], [10, 1, 2], [1, 2, 3], [7, 8, 9]]

trnvg8h3

trnvg8h34#

带替换采样

使用random.choices

x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 1, 2]])
samples = random.choices(x, k=20)

字符串

采样不更换

使用random.sample

x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 1, 2]])
samples = random.sample(x.tolist(), k=2)

pokxtpni

pokxtpni5#

或者,使用random生成索引;然后从数组中切片。适用于任何尺寸

n_sample = 10 #sample count
a_list [np.random.randint(0,a_list.shape[0], n_sample )]

字符串

相关问题