尝试对多变量函数使用np.piecewise时获取ValueError

时间:2019-02-05 19:29:02

标签: python numpy valueerror piecewise

我正尝试使用DesiredCapabilities caps = new DesiredCapabilities(); caps.SetCapability("deviceName", "iPhone 8 Simulator"); caps.SetCapability("deviceOrientation", "portrait"); caps.SetCapability("platformVersion", "12.0"); caps.SetCapability("platformName", "iOS"); caps.SetCapability("browserName", "Safari"); caps.SetCapability("username", SauceUsername); caps.SetCapability("accessKey", SauceAccessKey); caps.SetCapability("name", TestContext.TestName); _driver = new RemoteWebDriver(new Uri("http://ondemand.saucelabs.com:80/wd/hub"), caps, TimeSpan.FromSeconds(600)); 定义多元分段函数,如下所示:

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]
    ]
)

对于上下文,我试图表示一个映射f:R ^ 2-> R,一次在ValueError: shape mismatch: value array of shape (3,) could not be broadcast to indexing result of shape (3,2) 的每一行上对其求值。

有什么主意吗?我需要不同地定义最终参数,以便正确广播索引吗?

2 个答案:

答案 0 :(得分:0)

如果在np.piecewise中有两个数组,则

IMO 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)产生您想要的答案。

答案 1 :(得分:0)

通过使用结构化数组,我可以将2d公式转换为1d格式:

32000

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返回的数组的形状和dtype与piecewise相同,即使X仅返回标量值。