Python(NumPy)数组,具有无法预定义的可选长度

2024-05-23 23:45:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

假设我有一个二维问题,有一个刚性地面,上面有一个柔性层,通过等距弹簧与地面相连。在柔性层的顶部有一个圆柱体,它(如果你喜欢)粘在柔性层的边缘上。现在,圆柱体从边缘开始水平滚动,以无数增量影响弹簧的开口。你知道吗

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


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

  • 创建一个力array,每个增量包含一个单独弹簧中所有力的列表。复杂性来自这样一个事实,即该列表没有预定义的长度,也不是每个数字增量的长度相同。注意,在这种情况下,增量的数量是通过例如linspace预定义的

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

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

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

输出:

[ 0.]
[  0.  20.]
[  0.  10.  20.]
[array([ 0.]), array([  0.,  20.]), array([  0.,  10.,  20.])]

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


Tags: 代码in数量数字柔性array增量边缘
2条回答

老实说,我建议使用完整的数组,因此每个spring使用一列。例如,结合numexpr(https://code.google.com/p/numexpr)模块,在每个时间步提取所有“活动”弹簧非常简单和快速。你知道吗

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

更多(num)Python

在python中,您可以编写

    n = len(stresses)
    forcej = zeros( n )     # Initialize Forces in current increment

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

更优雅的是,作为一个列表:

    forcej = array([ area * stress for stress in stresses ])

(请注意,python中的局部变量按约定在lowercasesnake_case中命名。)

但这是NumPy代码,所以让我们用标量向量乘法代替:

    forcej = area * stresses

矩阵数组进行并行向量计算

在您的简单示例中,甚至可以使用单个标量矩阵乘法计算所有增量的力:

from numpy import array, linspace

area = 2.0

stresses = array([ linspace(0., 10., inc)  for inc in range(1, 4)])
print 'stresses =\n', stresses

forces = area * stresses
print
print 'forces =\n', forces

输出

stresses =
[[ 0.] [  0.  10.] [  0.   5.  10.]]

forces =
[[ 0.] [  0.  20.] [  0.  10.  20.]]

现在,由于行的大小不同(每行代表一个增量),stresses并不是一个真正的矩阵,只是一个数组。因此,向量矩阵乘法和矩阵矩阵乘法(这将需要写现实,更复杂的计算,这简洁)将失败。(标量矩阵乘法不关心矩阵的形状。显然,它甚至不必是actual matrix。)

实矩阵

但是如果我理解正确的话,尺寸的变化仅仅是因为弹簧在各自的增量中没有应力。你知道吗

因此,如果您想使用矩阵运算,而不是完全保留零项,请考虑使用sparse matrices。它们避免存储零条目或对它们进行计算,这样只会产生新的零条目,但它们仍然“知道”有零条目和矩阵的完整形状(从而保持矩阵乘法等有意义)。你知道吗

相关问题 更多 >