Numpy将标量转换为数组

时间:2015-05-21 22:04:56

标签: python numpy

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

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

的任意函数
x = numpy.linspace(min, max, num)
y = numexpr.evaluate(expr, {'x': x}, {})

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

y = numpy.ones(x.size) * y

但是我担心这对于大尺寸来说是浪费。还有更好的方法吗?

4 个答案:

答案 0 :(得分:10)

请参阅atleast_1d

  

将输入转换为至少包含一个维度的数组。

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

答案 1 :(得分:4)

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

x = np.asarray(x).reshape(1, -1)[0,:]

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

x = np.asarray(x) * np.ones(1)

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

x = np.array(x, ndmin=1, copy=False)

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

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

答案 2 :(得分:1)

您可以使用重塑:np.reshape(x, (1,1))

以下是演示:

>>> x = 4
>>> a = np.reshape(x, (1,1))
>>> a[0]
array([4])
>>> a[0][0]

答案 3 :(得分:0)

lin_reg.predict(np.array(6.5).reshape(1,-1))