基于参数列表返回数组的numpy数组

时间:2017-03-09 18:22:56

标签: python arrays numpy

我有一个非常简单的代码来计算垂直运动。我已经设置了一些初始条件(在这种情况下为v0s)。而不是在v0s的每一个上运行for循环,是通过"应用"每个v0x 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))

2 个答案:

答案 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)