Numpy将标量转换为数组

Rya*_*ell 10 python numpy

我正在用x数组来评估任意表达式,例如3*x**2 + 4.这通常会产生一个x形状的数组.但是,如果表达式只是一个常量,它将返回一个标量.在没有明确检查形状的情况下,确保其具有x形状的最佳方法是什么?乘以numpy.ones(x.shape)可以正常工作,但我认为这会使用不必要的计算.

编辑:要清楚,我不只是希望它是一个大小为1的数组,我希望它与X的形状和大小相同.我正在使用NumExpr评估一个字符串,它可以包含x的任意函数:

x = numpy.linspace(min, max, num)
y = numexpr.evaluate(expr, {'x': x}, {})
Run Code Online (Sandbox Code Playgroud)

我想得到一个y值的数组,可以通过matplotlib对x进行绘制.目前我这样做,工作正常:

y = numpy.ones(x.size) * y
Run Code Online (Sandbox Code Playgroud)

但是我担心这对于大尺寸来说是浪费.有没有更好的办法?

Con*_*tor 13

至少_1:

将输入转换为至少具有一个维度的数组.

>>> import numpy as np
>>> x = 42  # x is a scalar
>>> np.atleast_1d(x)
array([42])

>>> x_is_array = np.array(42)  # A zero dim array
>>> np.atleast_1d(x_is_array)
array([42])

>>> x_is_another_array = np.array([42])  # A 1d array
>>> np.atleast_1d(x_is_another_array)
array([42])

>>> np.atleast_1d(np.ones((3, 3)))  # Any other numpy array
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])
Run Code Online (Sandbox Code Playgroud)


And*_*ker 4

当我不确定 x 是标量、列表/元组还是数组时,我一直在使用:

x = np.asarray(x).reshape(1, -1)[0,:]
Run Code Online (Sandbox Code Playgroud)

或者,通过 (ab) 使用广播规则,您同样可以编写:

x = np.asarray(x) * np.ones(1)
Run Code Online (Sandbox Code Playgroud)

也许稍微简化的语法是在数组构造函数上使用额外的参数:

x = np.array(x, ndmin=1, copy=False)
Run Code Online (Sandbox Code Playgroud)

这将确保数组至少有一维。

但这是 numpy 中看起来有点笨拙的事情之一