我有一个程序可以输出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])
])
答案 0 :(得分:2)
由于您没有矩阵,因此无法从Numpy的矢量化功能中受益。相反,您可以按照以下方式使用itertools.zip_longest
和filter
来获得所需的内容:
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
映射到nanmean
,sum
映射到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)