首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试将np.piecewise用于多元函数时获取ValueError

尝试将np.piecewise用于多元函数时获取ValueError
EN

Stack Overflow用户
提问于 2019-02-06 03:29:02
回答 2查看 226关注 0票数 1

我尝试使用np.piecewise定义一个多变量分段函数,如下所示:

代码语言:javascript
复制
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]
    ]
)

运行此代码段会出现以下错误:

代码语言:javascript
复制
ValueError: shape mismatch: value array of shape (3,) could not be broadcast to indexing result of shape (3,2)

对于上下文,在本例中,我尝试表示一个映射f: R^2 -> R,一次在X的每一行上对其求值。

有什么想法吗?我是否需要以不同的方式定义最后一个参数,以便索引正确广播?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-06 04:10:02

如果您有两个来自np.meshgrid的数组,则IMO np.piecewise更适合,这样np.piecewise就可以将条件的维数与您的数组维数相匹配。

在您的示例中,要使用形状为(n,2)的输入并逐行计算(每列表示一个变量)来表示从$f:R^2到R$的分段映射,生成矢量化代码的最简单方法就是使用np.select

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-02-06 05:38:33

通过使用结构化数组,我可以将二维公式转换为一维公式:

代码语言:javascript
复制
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返回一个与X具有相同形状和数据类型的数组,即使lambdas只返回标量值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54541724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档