【问题标题】:Returning an numpy array of array based on a list of parameters根据参数列表返回一个numpy数组
【发布时间】:2017-03-10 05:44:29
【问题描述】:

我有一个非常简单的代码来计算垂直运动。我已经设置了一些初始条件(在本例中为 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))

【问题讨论】:

  • frompyfunc 可能是你想在这里尝试的
  • array of arrays 不明确。你的意思是一个 2d numpy 数组(浮点数)?还是带有数组元素的一维对象数组? VerticalPosition 适用于可广播数组。走对象数组路线更棘手也更慢。

标签: python arrays numpy


【解决方案1】:

虽然@pekapa 的答案(返回一个二维浮点数组)是大多数人推荐的方法,但这里有一个生成数组数组的方法。

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)

【讨论】:

  • 但您必须将x 视为一个全局变量。您无法通过frompyfunc 传递它,因为它会尝试针对v0s 广播它,并生成一个浮点值对象数组。在这里,我认为它与原始列表迭代相比并没有太大优势。通常数组列表比数组数组好。
  • @hpaulj 同意。我认为唯一的优势——如果你真的想要一个数组数组——是它可以相对容易地控制新数组的深度。实际上,我一直在想,因为数组构造函数中有一个ndmin kw;为什么没有ndmax?你碰巧知道吗?我应该提出这样的问题吗?找到了stackoverflow.com/questions/38774922/…
  • 确实,我的示例没有显示任何需要数组数组,因为我的第二级数组具有相同的维度(不可能是这种情况),但实际上这需要 X 作为全局并且我必须避免(试图在未来的某个时候发挥作用)。
【解决方案2】:

您只需要使用所有向量,就您而言,这很简单。

尝试将 v0s 作为向量:

v0s = np.array([[1], [2], [3]])

注意它是一个 3x1 向量,v0s.shape 应该是 (3, 1)

你的x linspace已经是一个向量x.shape(101,)

现在您可以将它们相乘。或者,直接使用新的v0s 向量调用VerticalPosition,即

y = VerticalPosition(v0s, g, x)

【讨论】:

  • 从技术上讲,这不会产生 OP 要求的数组数组。
  • 确实如此。 python矩阵只不过是一个数组数组。您甚至可以通过打印结果进行检查:array([[ ... ], [ ... ], [ ... ]])
  • 如果您想了解二维标量数组和一维标量数组的区别:看看这个简单的例子 [[1,2],[3,4,5 ]]。在不破坏其结构的情况下无法表示为标量数组。非常直接地表示为数组数组。
  • np.split 甚至list(y) 可用于创建数组列表。
猜你喜欢
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
  • 2011-04-06
  • 1970-01-01
  • 2018-05-02
相关资源
最近更新 更多