二维numpy.力量对于多项式展开

2024-10-01 13:44:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图写一个函数,将2d-ndarray映射到2d-ndarray。输入数组的行可以独立处理,输入行和输出行之间应该有1:1的对应关系。对于输入的每一行,应计算该行给定顺序的多项式展开(示例见docstring)。当前的实现是可行的;但是它需要在“powerMatrix”中对行和行的重复进行显式循环。是否可以通过一次调用来获得相同的结果numpy。力量?顺便说一句:结果行中的条目顺序对我来说并不重要。在

import numpy
def polynomialFeatures(x, order):
    """ Generate polynomial features of given order for data x.

    For each row of ndarray x, the polynomial expansions are computed, i.e
    for row [x1, x2] and order 2, the following row of the result matrix is
    computed: [1, x1, x1**2, x2, x1*x2, x1**2*x2, x2**2, x1*x2**2, x1**2*x2**2]

    Parameters
    ----------
    x : array-like
        2-D array; for each of its rows, the polynomial features are created

    order : int
        The order of the polynomial features

    Returns
    -------
    out : ndarray
        2-D array of shape (x.shape[0], (order+1)**x.shape[1]) containing the 
        polynomial features computed for the rows of the array x

    Examples
    --------
    >>> polynomialFeatures([[1, 2, 3], [-1, -2, -3]], 2)
    array([[  1   3   9   2   6  18   4  12  36   1   3   9   2   6  18   4  12  
             36   1   3   9   2   6  18   4  12  36]
           [  1  -3   9  -2   6 -18   4 -12  36  -1   3  -9   2  -6  18  -4  12 
            -36   1  -3   9  -2   6 -18   4 -12  36]])
    """
    x = numpy.asarray(x)
    # TODO: Avoid duplication of rows
    powerMatrix = numpy.array([range(order+1)] * x.shape[1]).T
    # TODO: Avoid explicit loop, and use numpy's broadcasting
    F = []
    for i in range(x.shape[0]):
        X = numpy.power(x[i], powerMatrix).T
        F.append(numpy.multiply.reduce(cartesian(X), axis=1))

    return numpy.array(F)

print numpy.all(polynomialFeatures([[1, 2, 3], [-1, -2, -3]], 2) ==
                numpy.array([[1,   3,   9,   2,   6,  18,   4,  12,  36,   1,
                              3,   9,   2,   6,  18,   4,  12,  36,   1,   3, 
                              9,   2,   6,  18,   4,  12,  36],
                             [1,  -3,   9,  -2,   6, -18,   4, -12,  36,  -1,
                              3,  -9,   2,  -6,  18,  -4,  12, -36,   1,  -3,
                              9,  -2,   6, -18,   4, -12,  36]]))

谢谢, 一月

编辑:此处定义了缺少的笛卡尔函数:Using numpy to build an array of all combinations of two arrays


Tags: ofthenumpyfororderarrayrowfeatures
1条回答
网友
1楼 · 发布于 2024-10-01 13:44:45

基本思想是将与计算无关的维度(在您的例子中,是维度0,行数)移动到一个更高的维度中,然后自动在其上广播。在

我不确定您的cartesian方法在做什么,但是这里有一个解决方案,它使用np.indicesX矩阵上生成索引元组:

import numpy as np
def polynomial_features(x, order):
    x = np.asarray(x).T[np.newaxis]
    n = x.shape[1]
    power_matrix = np.tile(np.arange(order + 1), (n, 1)).T[..., np.newaxis]
    X = np.power(x, power_matrix)
    I = np.indices((order + 1, ) * n).reshape((n, (order + 1) ** n)).T
    F = np.product(np.diagonal(X[I], 0, 1, 2), axis=2)
    return F.T

相关问题 更多 >