首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有不能预定义的可选长度的Python (NumPy)数组

具有不能预定义的可选长度的Python (NumPy)数组
EN

Stack Overflow用户
提问于 2015-03-23 10:28:22
回答 1查看 122关注 0票数 1

我目前正在编写一个数值python代码(从头开始),以解决以下思想问题:

想象一下,我有一个二维问题,一个刚性的地面,上面有一个柔性的层,通过等距的弹簧连接到地面上。在柔性层的顶部有一个圆柱体,它(如果你愿意的话)粘在柔性层的边缘。现在,圆柱体以无数的增量水平滚动,从边缘开始影响弹簧的开口。

现在我的问题涉及到以下几个方面:由于弹簧力和施加在圆柱上的力矩之间的平衡,一定数量的弹簧将在平衡时打开。由于问题的非线性,这几个开弹簧的数目是事先不知道的。此外,我不想对整个几何学建模,而是只考虑相关的开启弹簧。在这个过程中,我想,例如,将合力存储在每个打开的弹簧中,对应于某个时刻的增量。

因此,在我看来,这里的编程问题是:

  • 创建一个Force array,它为每个增量包含单个弹簧中所有力的列表。复杂性来自这样一个事实:这个列表没有预先定义的长度,对于每个数值增量来说,这个长度也不是相同的。请注意,在本例中,增量的数目是通过例如一个linspace预定义的。

我一直在寻找一个适合这个问题的Pythonic解决方案,但还没有找到一个。我认为NumPy库应该提供一个方便的解决方案,但是我缺乏Python的经验,也没有找到一个很好的例子。如果您对上述设置更方便的话,我也愿意采用其他方法。

目前,我有下面的代码示例来展示我的方法:

代码语言:javascript
运行
复制
from numpy import array , zeros , linspace

area = 2.0
Forces = []                 # Initialize complete Force array

for inc in range(1,4):
    stresses = linspace(0.,10.,inc)
    n = len(stresses)
    Forcej = zeros( n )     # Initialize Forces in current increment

    for i, stress in enumerate(stresses):
        Forcej[i] = area*stress

    print Forcej
    Forces.append(Forcej)


print Forces

其中产出:

代码语言:javascript
运行
复制
[ 0.]
[  0.  20.]
[  0.  10.  20.]
[array([ 0.]), array([  0.,  20.]), array([  0.,  10.,  20.])]

我想这是我想要的结果,但我认为这远远不是最优雅的解决方案,有人能对这个例子提供帮助或评论吗?谢谢你考虑我的问题。

EN

回答 1

Stack Overflow用户

发布于 2015-03-23 11:14:04

老实说,我建议使用一个完整的数组,所以每个春季都使用一个列。结合例如numexpr (https://code.google.com/p/numexpr)模块,在每个时间步骤中提取所有“活动”弹簧是非常容易和快速的。

我相信一个完整的数组是可行的,因为它很好地映射到底层系统处理内存访问的方式。所以,除非弹簧的数量是hugh (比方说>100000),否则我相信拖动大量的零不会降低性能。另一种选择可能是寻找有效的稀疏矩阵。我知道SciPy支持它。我不确定你从你的问题中得到的矩阵“概要”是否很适合稀疏矩阵。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29207920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档