Python 从非均匀numpy数组获取转置和/或从非均匀numpy数组获取平均值

Python 从非均匀numpy数组获取转置和/或从非均匀numpy数组获取平均值,python,arrays,python-3.x,numpy,Python,Arrays,Python 3.x,Numpy,我有一个程序,可以输出numpy数组,例如: [[a1, a2], [b1], [c1, c2, c3]] 有没有一种优雅的python方法可以将此转化为此 [[a1, b1, c1], [a2, c2], [c3]] 这样做的目的是获得列的总和/平均值,如果缺少某些值,这些列不会抱怨,因此我很高兴能够直接做到这一点。下面是一个复制过去的示例: import numpy test = numpy.array([ numpy.array([3, 5]),

我有一个程序,可以输出numpy数组,例如:

[[a1, a2],
 [b1],
 [c1, c2, c3]]
有没有一种优雅的python方法可以将此转化为此

[[a1, b1, c1],
 [a2, c2],
 [c3]]
这样做的目的是获得列的总和/平均值,如果缺少某些值,这些列不会抱怨,因此我很高兴能够直接做到这一点。下面是一个复制过去的示例:

import numpy
test = numpy.array([
        numpy.array([3, 5]),
        numpy.array([3.4]),
        numpy.array([2.8, 5.3, 7.1])
])

由于您没有矩阵,因此无法从Numpy的矢量化功能中获益。相反,您可以使用itertools.zip\u,并按以下方式进行筛选,以获得所需内容:

In [13]: import numpy as np

In [14]: import numpy
    ...: test = np.array(
    ...: [np.array([3 , 5]),
    ...:         np.array([3.4]),
    ...:         np.array([2.8,5.3,7.1])])
    ...:         

In [15]: from itertools import zip_longest

In [16]: [np.fromiter(filter(bool, i), dtype=np.float) for i in zip_longest(*test)]
Out[16]: [array([3. , 3.4, 2.8]), array([5. , 5.3]), array([7.1])]
请注意,使用bool作为过滤函数将消除bool值为False的项,如0或空字符串

如果您不确定数组中是否有这样的项,您可以使用另一个列表理解或带有筛选器的lambda函数


您可能还想看看大致相当于的实现,以便在返回列表之前首先生成所需的结果。

当您开始将numpy数组视为不完整的列表时,您将失去它们的所有好处。另一种方法是将空/缺失元素设置为NaN,并使用numpy套件中以NaN为前缀的函数来计算统计数据。例如,“映射到”、“映射到”等完整列表。这还有一个额外的优点,即间隙的顺序无关紧要

如果可能,让您的程序创建一个如下所示的数组:

test = np.array([
    [3.0, 5.0, np.nan],
    [3.4, np.nan, np.nan],
    [2.8, 5.3, 7.1]])
如果不是,下面是转换输入的基本尝试:

def to_full(a):
    output = np.full((len(a), max(map(len, a))), np.nan)
    for i, row in enumerate(a):
        output[i, :len(row)] = row
    return output
现在计算平均值很简单:

mean = np.nanmean(test, axis=0)

您是否尝试向上移动图元以填充其上方的间隙?如果没有,我不确定我是否理解你试图做的事情的逻辑。我试图从每个数组的所有第一、第二等元素中获得平均值,与它们的数量无关。我原以为一个解决方案是在这里详细说明转换,但我很高兴得到任何能使我达到平均值的东西。我想我已经想出了一个更好的选择。这对我来说很有效,幸运的是,我的程序不应该输出0或空字符串,谢谢!令人惊讶的是,您需要从某物导入一个包,从外部看,这并不困难。我事先不知道从我的程序中产生的数组的长度,因此数组的形式……但我认为这是我尝试做的更简单的解决方案。谢谢:Kasr–mvd的解决方案也可以工作,如果需要,还允许反转不均匀阵列。
mean = np.nanmean(test, axis=0)