【问题标题】:Getting ValueError when trying to use np.piecewise for multivariate function尝试将 np.piecewise 用于多元函数时出现 ValueError
【发布时间】:2019-06-29 16:53:20
【问题描述】:

我正在尝试使用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]
    ]
)

运行这个 sn-p 会出现以下错误:

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

对于上下文,我试图在此示例中表示一个映射 f: R^2 -> R,同时在 X 的每一行上对其进行评估。

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

【问题讨论】:

  • 根据文档,每个条件数组必须具有与X 相同的形状。他们是 (3,) 而X 是 (3,2)。 funclist 应该接受 1d 并返回 1d。你的拿一个 2d,然后返回一个 1d。如果X 是 1d,则文档和示例最有意义;可能可以使用 2d 输入,但需要非常小心和一些试验才能获得正确的尺寸。
  • 您是否注意到np.piecewise The output is the same shape and type as x。那就是地图来自f:R -&gt; R;不能是R^2 -&gt; R。在查看结构化数组产生的值之前,我忽略了该规定。

标签: python numpy valueerror piecewise


【解决方案1】:

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

在您的情况下,要表示分段映射 $f:R^2 \to 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) 会产生你想要的答案。

【讨论】:

    【解决方案2】:

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

    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 只返回标量值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-09
      • 2022-01-16
      • 2017-01-09
      • 1970-01-01
      • 1970-01-01
      • 2020-03-29
      • 1970-01-01
      • 2022-11-30
      相关资源
      最近更新 更多