我有一个非常简单的代码来计算垂直运动。我已经设置了一些初始条件(在这种情况下为v0s
)。而不是在v0s
的每一个上运行for循环,是通过"应用"每个v0
到x linspace
并且有一个数组的numpy数组。
import numpy as np
v0s = [1, 2, 3]
g = 9.81
def VerticalPosition(v0,g,t):
return(v0*t - 0.5 * g * t**2)
def Solution(v0,g):
return(2*v0/g)
def Apex(v0,g):
return(VerticalPosition(v0,g,v0/g))
x=np.linspace(0,Solution(max(v0s),g),101)
y=[]
for v0 in v0s:
y.append(VerticalPosition(v0,g,x))
答案 0 :(得分:1)
您只需要使用所有向量,并且在您的情况下,这非常简单。
尝试将v0s作为矢量:
v0s = np.array([[1], [2], [3]])
请注意,它是3x1向量,v0s.shape
应为(3, 1)
您的x linspace
已经是向量x.shape
(101,)
现在你可以将它们相乘。或者,使用新的VerticalPosition
向量直接呼叫v0s
,即
y = VerticalPosition(v0s, g, x)
答案 1 :(得分:1)
虽然@ pekapa的答案(返回2d浮点数组)是最值得推荐的,但这是一个生成数组数组的方法。
y = np.frompyfunc(lambda a, b: VerticalPosition(a, b, x), 2, 1)(v0s, g)
当内部数组具有不同的形状时,数组数组很有用。 (不是本例中的情况)。
在上面的表达式中使用x
。它取自封闭的(不一定是全局的)范围,但可以稍加谨慎管理。最简单的方法是将其打包在函数中并使其显式化。由于内部函数是立即评估的,然后丢弃x
是可变的,这里没有任何问题。
def capsule(v0s, g, x):
return np.frompyfunc(lambda a, b: VerticalPosition(a, b, x), 2, 1)(v0s, g)
这是一个基本上只适用于数组数组的例子:
a,b = np.ogrid[1:4, 5:9:2]
np.frompyfunc(np.arange, 2, 1)(a, b)
# array([[array([1, 2, 3, 4]), array([1, 2, 3, 4, 5, 6])],
# [array([2, 3, 4]), array([2, 3, 4, 5, 6])],
# [array([3, 4]), array([3, 4, 5, 6])]], dtype=object)