【问题标题】:Repeat Array while Maintaining Order within group在保持组内秩序的同时重复阵列
【发布时间】:2022-01-03 23:07:43
【问题描述】:

我有以下array 并想repeat 每个array n 次。

x_array

[array([14.91488012,  1.2986064 ,  4.98965322]),
 array([2.39389187e+02, 1.04442059e-01, 3.06391338e-01]),
 array([ 48.19437348, 201.09951372,   0.35223001]),
 array([ 19.96978171, 367.52578786,   0.68676553]),
 array([0.55120466, 0.27133609, 0.75646697]),
 array([8.21287360e+02, 1.76495077e+02, 4.87263691e-01]),
 array([184.03439377,   1.24823107,   5.33109884]),
 array([575.59800297, 186.4650814 ,   2.21028258]),
 array([0.50308552, 3.09976082, 0.10537899]),
 array([1.02259912e+00, 1.52282513e+02, 1.15085308e-01])]

我尝试过np.repeat(x_array, 2),但这并不能保留matrix/array 的顺序。我也尝试过x_array*2,但这似乎只是将新数组放在了底部。我想重复x_array[0] n 次,并为下一组arrays 做同样的事情,这样我就有了n 每个顺序。

提前致谢。

【问题讨论】:

  • 为什么是列表?
  • 这就是我目前设置数据以便循环遍历它的方式。
  • 你知道你可以遍历一个 ndarray 的行,对吧?也许这与问题无关,但仍然值得思考。
  • 我也尝试了for 循环,但没有得到预期的结果。

标签: python arrays numpy


【解决方案1】:

https://numpy.org/doc/stable/reference/generated/numpy.repeat.html 的最后一个示例为基础,

x_array = np.array(x_array) # Or a similiar operation to convert x_array to an ndarray vs. a list of arrays.   
expanded_x_array = np.repeat(x_array, n, axis=0)
print(expanded_x_array)

应该产生你正在寻找的东西。

【讨论】:

    【解决方案2】:

    你只需要指定

    >>> np.repeat(x_array, 2, axis=0)
    array([[1.49149e+01, 1.29861e+00, 4.98965e+00],
           [1.49149e+01, 1.29861e+00, 4.98965e+00],
           [2.39389e+02, 1.04442e-01, 3.06391e-01],
           [2.39389e+02, 1.04442e-01, 3.06391e-01],
           ...,
           [5.03086e-01, 3.09976e+00, 1.05379e-01],
           [5.03086e-01, 3.09976e+00, 1.05379e-01],
           [1.02260e+00, 1.52283e+02, 1.15085e-01],
           [1.02260e+00, 1.52283e+02, 1.15085e-01]])
    

    来自the docs

    numpy.repeat(a, repeats, axis=None)

    ...

    int可选
    沿其重复值的轴。 默认情况下,使用展平的输入数组,并返回一个展平的输出数组。

    (加粗)

    【讨论】:

      【解决方案3】:

      您可以使用列表推导:

      n = 2
      repeated_list = [row for row in a for _ in range(n)]
      print(repeated_list)
      

      【讨论】:

        【解决方案4】:

        您的术语令人困惑。你说它是一个“数组”,但显示看起来更像一个列表,而x_array*2 在底部放置一个“新数组”这一事实证实了 - 这是* 的列表使用。

        np.repeat(x_array) 首先创建一个数组(一个真正的数组!)

        np.array(x_array)
        

        是一个 (n,3) 浮点 dtype 数组。如果没有 axis np.repeat 会变平 - 如文档所述!

        指定axis=0 有效,因为它在第一个n 维度上重复。结果是一个 (2*n,3) float dtype 数组(不是列表)。

        可以创建一个包含这些数组的一维对象 dtype 数组。有了 repeat 就可以在没有轴参数的情况下工作。

        了解你拥有的东西并准确描述它,可以让这类任务变得更容易 - 问题也更清晰。

        插图

        制作一个数组列表:

        In [21]: alist = [np.ones(3,int),np.zeros(3,int),np.arange(3)]
        In [22]: alist
        Out[22]: [array([1, 1, 1]), array([0, 0, 0]), array([0, 1, 2])]
        

        列表重复:

        In [23]: alist*2
        Out[23]: 
        [array([1, 1, 1]),
         array([0, 0, 0]),
         array([0, 1, 2]),
         array([1, 1, 1]),
         array([0, 0, 0]),
         array([0, 1, 2])]
        

        从列表中创建一个二维数组:

        In [24]: np.array(alist)
        Out[24]: 
        array([[1, 1, 1],
               [0, 0, 0],
               [0, 1, 2]])
        

        repeat without axis 以扁平的方式重复元素:

        In [25]: np.repeat(alist,2)
        Out[25]: array([1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2])
        

        在 0 轴上重复这个二维数组:

        In [26]: np.repeat(alist,2,axis=0)
        Out[26]: 
        array([[1, 1, 1],
               [1, 1, 1],
               [0, 0, 0],
               [0, 0, 0],
               [0, 1, 2],
               [0, 1, 2]])
        

        列表中的对象 dtype 数组:

        In [27]: arr = np.empty(3,object); arr[:]=alist
        In [28]: arr
        Out[28]: array([array([1, 1, 1]), array([0, 0, 0]), array([0, 1, 2])], dtype=object)
        

        由于数组具有相同的大小,我们必须使用这种特殊构造。否则我们得到二维数组[24]。

        这个数组有一个repeat 方法,并且只有一维我们不需要指定轴。它重复对象元素、数组,而不是 2d [24] 数组中的数字。

        In [29]: arr.repeat(2)
        Out[29]: 
        array([array([1, 1, 1]), array([1, 1, 1]), array([0, 0, 0]),
               array([0, 0, 0]), array([0, 1, 2]), array([0, 1, 2])], dtype=object)
        

        【讨论】:

          猜你喜欢
          • 2018-04-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-13
          • 2013-07-22
          • 2017-12-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多