我正在用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
但是我担心这对于大尺寸来说是浪费。还有更好的方法吗?
答案 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))