【问题标题】:Numpy Random Choice not working for 2-dimentional listNumpy 随机选择不适用于二维列表
【发布时间】:2018-09-28 10:01:03
【问题描述】:

我运行了以下 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

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

【问题讨论】:

  • 请修正您问题中的格式并包含错误消息。您说的是“下面的错误消息”,但没有错误消息
  • 你没有包含错误
  • 哦,对不起!现在检查一下,我已经包含了它

标签: python list numpy


【解决方案1】:

您将需要使用索引:

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)]

【讨论】:

  • 一种更短的生成索引的方法。
  • @hpaulj 哎呀,误解了这个建议。已编辑,谢谢。
【解决方案2】:

替换抽样

使用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)

【讨论】:

    【解决方案3】:

    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.

    【讨论】:

      【解决方案4】:

      或者可以map:

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

      演示:

      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]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-11
        • 1970-01-01
        • 1970-01-01
        • 2020-02-23
        相关资源
        最近更新 更多