首页 > 解决方案 > 将列表中的平面列表添加到固定长度的 numpy 数组中

问题描述

我正在尝试将列表中的平面列表添加到固定长度的 numpy 数组中。

import numpy as np

def extract_foo(x):
    return x.size


def extract_foo_of_foo(x):
    return [x.size for _ in range(18)]


def extract_feats():
    input_array = np.ones((36,))
    output_matrix = np.empty((36, 22))

    for x_idx, x_val in enumerate(input_array):
        output_matrix[x_idx] = [
            extract_foo(x_val),
            extract_foo(x_val),
            extract_foo(x_val),
            extract_foo(x_val),

            # this is where I want to flatten my list
            # that one is a list of list containing 22 - 4 = 18 lists
            extract_foo_of_foo(x_val)
        ]

    return output_matrix

我尝试了如下列表理解:

[y for y in extract_foo_of_foo(x_val)]

并具有减少功能:

reduce(lambda y: y, extract_foo_of_foo(x_val))

我正在使用 numpy 1.17.4 和 python 3.7.5。有没有一种pythonic方法来处理这个?

标签: pythonpython-3.xnumpypython-3.7

解决方案


如果我正确理解了您的问题,我相信您可以像这样在第二个轴上使用切片索引:

def extract_feats():
    input_array = np.ones((36,))
    output_matrix = np.empty((36, 22))
    for x_idx, x_val in enumerate(input_array):
        output_matrix[x_idx, 0:4] = [
            extract_foo(x_val),
            extract_foo(x_val),
            extract_foo(x_val),
            extract_foo(x_val)
        ]
        output_matrix[x_idx, 4:22] = extract_foo_of_foo(x_val)
    return output_matrix

这是输出的形状:

>>> extract_feats().shape
(36, 22)

推荐阅读