我正在用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)
当我不确定 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 中看起来有点笨拙的事情之一
归档时间: |
|
查看次数: |
10755 次 |
最近记录: |