获取ValueError异常试图用np.piecewise关于多元函数时

问题描述 投票:1回答:2

我想如下定义使用np.piecewise多元分段函数:

X = np.array([
    [1, 2],
    [3, 4], 
    [5, 6]
])

pw = np.piecewise(
    X,
    [
        np.abs(X[:, 0] - X[:, 1]) < 1,
        np.abs(X[:, 0] - X[:, 1]) >= 1
    ],
    [
        lambda X: 1 + 2 * X[:, 0] + 3 * X[:, 1],
        lambda X: 1.5 + 2.5 * X[:, 0] + 3.5 * X[:, 1]
    ]
)

运行这段代码giives以下错误:

ValueError: shape mismatch: value array of shape (3,) could not be broadcast to indexing result of shape (3,2)

对于上下文,我试图表示映射f:R ^ 2 - > R的例子中,一次在每个X的行的评价它。

任何想法?我需要不同的定义最终的参数,以便正确索引广播?

python numpy valueerror piecewise
2个回答
0
投票

IMO np.piecewise更适合,如果你从np.meshgrid有两个数组,这样np.piecewise可以与您的阵列尺寸符合条件的尺寸。

你的情况,来表示一个分段地图$ F:R ^ 2 \至R $与输入是形状(n,2)的和由行计算行(表示变量中的每个列),以产生将被简单地使用np.select量化代码的最简单的方法:

def pw(X):
    return np.select([np.abs(X[:,0] - X[:,1]) < 1, np.abs(X[:,0] - X[:,1]) >= 1], 
            [1 + 2 * X[:, 0] + 3 * X[:, 1], 1.5 + 2.5 * X[:, 0] + 3.5 * X[:, 1]])

pw(X)得到你想要的答案。


0
投票

通过使用结构化阵列I可以铸2D配制成1D之一:

In [76]: X = np.array([(1,2),(3,4),(5,6)],'f,f')
In [77]: X
Out[77]: array([(1., 2.), (3., 4.), (5., 6.)], dtype=[('f0', '<f4'), ('f1', '<f4')])
In [78]: pw = np.piecewise(
    ...:     X,
    ...:     [
    ...:         np.abs(X['f0'] - X['f1']) < 1,
    ...:         np.abs(X['f0'] - X['f1']) >= 1
    ...:     ],
    ...:     [
    ...:         lambda X: 1 + 2 * X['f0'] + 3 * X['f1'],
    ...:         lambda X: 1.5 + 2.5 * X['f0'] + 3.5 * X['f1']
    ...:     ]
    ...: )
In [79]: pw
Out[79]: 
array([(11., 11.), (23., 23.), (35., 35.)],
      dtype=[('f0', '<f4'), ('f1', '<f4')])

这些数字是重复pw因为piecewise返回与相同的形状和D型细胞作为X阵列,即使仅lambdas返回标量值。

© www.soinside.com 2019 - 2024. All rights reserved.