重复阵列,同时保持组内的顺序



我有以下array,想repeatarrayn次。

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

每个总数。提前谢谢。

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

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

您只需要指定

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

从文档中:

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

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

(加粗)

您可以使用列表推导:

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

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

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

np.array(x_array)

是一个 (n,3) 浮点型 dtype 数组。 没有axisnp.repeat扁平化 - 如记录的那样!

指定axis=0有效,因为它在第一个n维度上重复。 结果是一个 (2*n,3) 浮点 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])]

从列表中创建一个 2D 数组:

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

不带轴重复 以展平方式重复元素:

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 轴上重复此 2D 数组:

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)

由于数组具有相同的大小,因此我们必须使用这种特殊的构造。 否则我们会得到 2d 数组 [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)

最新更新