从不均匀的numpy数组获取转置和/或从不均匀的numpy数组获取平均值

时间:2019-04-17 12:05:44

标签: python arrays python-3.x numpy

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

[[a1, a2],
 [b1],
 [c1, c2, c3]]

是否有一种优雅而蟒蛇般的方式将其转化为这个?

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

2 个答案:

答案 0 :(得分:2)

由于您没有矩阵,因此无法从Numpy的矢量化功能中受益。相反,您可以按照以下方式使用itertools.zip_longestfilter来获得所需的内容:

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作为过滤功能将消除0或空字符串等布尔值均为False的项目。

如果不确定数组中是否包含此类项目,则可以仅使用另一个列表推导或将lambda函数与filter一起使用。

[np.array([for i in sub if i is not None]) for sub in zip_longest(*test)]

您可能还想看看zip_longest的大致等效实现,以便(如果可能)在返回该列表之前首先生成所需的结果。

答案 1 :(得分:2)

当您开始将numpy数组视为破烂列表时,您将失去所有好处。另一种选择是将空/缺失元素设置为NaN,并在numpy套件中使用以“ nan”为前缀的函数来计算统计信息。例如,mean映射到nanmeansum映射到nansum,依此类推(完整列表here)。这样做还有一个好处,就是间隙的顺序无关紧要。

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

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)