Python 如何根据数组的长度重新排列存储在列表中的numpy数组

Python 如何根据数组的长度重新排列存储在列表中的numpy数组,python,arrays,algorithm,split,Python,Arrays,Algorithm,Split,我有一个numpy数组列表,希望根据每个数组的长度重新排列它。这是我的清单: nums=[np.array([[2.], [3.]]), np.array([[8.], [7.], [1.]]),\ np.array([[1.], [0.], [5.]]), np.array([[8.], [9.]]), np.array([[7.], [6.]])] 当数组的长度发生变化时,这一点很重要。长度列表为: lns=[2, 3, 3, 2, 2] 根据lns,长度从第一个数组更改为第

我有一个numpy数组列表,希望根据每个数组的长度重新排列它。这是我的清单:

nums=[np.array([[2.], [3.]]), np.array([[8.], [7.], [1.]]),\
      np.array([[1.], [0.], [5.]]), np.array([[8.], [9.]]), np.array([[7.], [6.]])]
当数组的长度发生变化时,这一点很重要。长度列表为:

lns=[2, 3, 3, 2, 2]
根据
lns
,长度从第一个数组更改为第二个数组。第一个数组较短,我需要它的所有行。我想要
2
(短数组的长度)行中的长(秒)行。在这种情况下,较短数组(
2.5
)的平均值小于较长数组(
5.3
)的平均值,因此我提取较长数组的第一行
2
。我想要第二个和第三个数组,因为它们的长度是最大的。从第三个到第四个长度变化。同样,我希望所有行都更短,并且
2
(更短的长度,即第四行)。但是,较短(
8.5
)的平均值高于较长(
2.
)。因此,我需要最后一行较长的
2行。最后,我想重新排列我的列表,以获得以下列表:

final=[np.array([[2.], [3.], [8.], [7.]]),\ # all rows of first and first 2 rows of second
       np.array([[8.], [7.], [1.], [1.], [0.], [5.]]),\
       np.array([[0.], [5.], [8.], [9.], [7.], [6.]])]# last 2 rows of third and all rows of next short arrays
我非常感谢任何人帮助我用python做我想做的事情。

1。首先,我使用一次获取两个连续的元素,而不是使用索引:

导入itertools
# https://docs.python.org/3/library/itertools.html#itertools-食谱
def成对(可编辑):
“s->(s0,s1),(s1,s2),(s2,s3),…”
a、 b=itertools.T形三通(ITERRABLE)
下一个(b,无)
返回拉链(a、b)
二,。我创建了一个helper函数
first\u或_last()
,它返回一个可以,并应用于正在比较的两个相邻数组3中较大的一个。根据上述逻辑,需要应用哪个切片取决于平均值/平均值。如果您愿意,可以将其简化为两行函数,我使用了较长的版本进行注释/解释

def first_或def last(更小、更大):
“”“返回前n个项目或项目的切片对象”
较大数组的最后n项
"""
尺寸=透镜(更小)
如果np.平均值(较小)
三,。进行重新排列的代码:

nums=[np.array([[2.],[3.]]),np.array([[8.],[7.],[1.]]),
np.array([[1.],[0.],[5.]]),np.array([[8.],[9.]]),以及,
np.array([[7.],[6.]])]
最终=[]
对于成对排列的ar1和ar2(nums):
l1,l2=len(ar1),len(ar2)
如果l1==l2:#相同长度
final.append(np.append(ar1,ar2,axis=0))
持续
#不同长度
arrs=(ar1,ar2[第一个或最后一个(ar1,ar2)],如果l1
最终值

[数组([[2.],[3.],[8.],[7.]]),
数组([[8.]、[7.]、[1.]、[1.]、[0.]、[5.]]),
数组([[0.]、[5.]、[8.]、[9.]]),
数组([[8.]、[9.]、[7.]、[6.]])]

注:

  • 此文件的输出与您的
    final
    不同。请看,因为我没有看到使结果包含3项而不是4项的规则/逻辑

    9。逻辑中的另一个不一致性:对于数组3(len 3)和数组4(len 2),结果应该是
    0 5 8 9
    ,结果中的最后一项应该是
    8 9 7 6
    。为什么最后这些合并为一个
    0589776
    ?它们应该分开。将它们全部合并到第3、第4和第5阵列(而不是第1、第2和第3阵列)的逻辑是什么

  • 此解决方案不会为提供错误,但它似乎不是正确的输出-即使它遵循相同的规则

  • NumPy数组切片返回原始数组上的视图,而不是副本


  • 1.展示你的尝试。2.你的逻辑有点太复杂了。第一个数组的长度为2,但在
    最终的
    中,它的长度为4。3.为什么在
    final
    中第二个和第三个数组合并为一个数组?因为同样的长度?4.取前2个元素(较短相邻元素的长度)或最后2个元素的长度是基于两个阵列的平均值?或者它是基于哪个数组最先出现?5.您使用了numpy数组,但没有标记numpy。你真的在使用numpy数组、Python数组或常规Python列表吗?好的,根据另一个问题,你会得到一个任意点列表(在2D空间,在另一个问题中,但实际上是3D空间),它可能表示形状。并且要在2D/3D中创建相交形状;忽略不能形成闭合多边形的点(因此线是不合适的)。有这样的描述更好。此外,1D版本也没有帮助,因为它有一些不相关的因素,比如取平均值。如果两个相邻的形状有非常不同的大小并且没有连接,那么做“平均”的事情在任何方面都没有帮助。你不必每次都说“亲爱的”。零次/一次就足够了:-)我想在开始更多的问题之前先等一会儿。如果48小时后没有令人满意的答案,你可以回答另一个问题。我可以试着回答这个问题,但它实际上并不能解决您在原始问题上遇到的问题。@aneroid,实际上我的观点是3d(
    x
    y
    z
    )。但是我只根据
    x
    y
    重新排列它们。谢谢你的解决方案。但是,让我们假设所有数组的长度都是3。然后,我只需要一个数组,因为它们都具有最大长度。或者,例如,让我们考虑第一个数组的长度也是3,那么我只想拥有两个数组。你能不能把这个解决方案集中到我在另一篇文章中提到的问题上?提前感谢您的反馈。Aga