【发布时间】:2016-05-30 13:49:34
【问题描述】:
我正在使用 numpy 在 python 中开发一个有限体积的传热模型。我有许多垂直堆叠的单元(计划明年转移到 3d 模型),每个单元都有不同的温度。
*要计算电池之间的热传递,我需要取决于电池温度的热导率。
热导率及其相应温度(以摄氏度为单位)存储在矩阵TC 中,电池温度(以摄氏度为单位)存储在向量(将来在矩阵中)T_Cell 中。这些数组看起来像:
TC = numpy.array([[0,569],[1,574],[2,582],[3,590],[4,598],[5,606],[6,613],[7,620]])
T_Cell = numpy.array([[7],[5],[5],[4],[4],[3],[1],[0],[0]])
TC 中的温度对应于它们的行索引,因此可以通过温度索引(存储在 T_Cell 中的值)来访问热导率,例如电池温度为T_Cell=5。这里显示的是索引为 2 的单元格:
TC_Cell = TC[numpy.round(T_Cell[2]),1]
导致TC_Cell = 606。
是否有一个阵列操作可以让我在与T_Cell 形状相同的阵列中获得电池的热导率(仅取决于电池的温度)?比如TC和T_Cell的数组如上图:
TC_Cell = TC[T_Cell, 1]
因此 TC_Cell 的结果如下所示:
TC_Cell = array([[620],
[606],
[606],
[598],
[598],
[590],
[574],
[569],
[569]])
不需要插值,因为我已经将 TC 中的值插值到令人满意的程度(此处未显示以保持干净,数组中的值也被简化且物理上不正确)。*
我真的不知道为什么,但是突然之间它的工作方式与我的示例中显示的完全一样......也许我的代码中某处有错字...... :-/ 虽然我的第二个问题仍未解决。
我的第二个问题是: 我有一个微分方程,它的解取决于一个参数是零还是非零。这个参数取决于单元格,所以它可能是
Arg = numpy.array([[0.12],[0.9],[0],[0],[0.2]])
目前我决定使用哪种解决方案的方法是在Arg-vector(将来:3d-array)上运行一个for循环并检查一个单元格是否为0。喜欢:
a=1
c=2
d=3
for cell in range(numpy.size(Arg, 0)):
if Arg[cell, 0] != 0:
# Solution1:
Solution[cell] = (a / Arg[cell] + c) * numpy.e**(Arg[cell] * d) - (a / Arg[cell])
elif Arg[cell, 0] == 0:
# Solution2:
Solution[cell] = a * d + c
结果:
Solution = array([[ 6.47773728],
[ 45.18138759],
[ 5. ],
[ 5. ],
[ 7.7548316 ]])
是否有可以避免使用 for 循环的数组操作?
为了避免由于缺少信息而造成的进一步混乱:a 也是一个与 @ 大小/形状相同的数组987654339@:
a = numpy.array([[1],[1],[1],[1],[1]])
(而且值不一定是1!)
提前感谢您的帮助!
【问题讨论】:
-
布尔掩码是有条件地应用计算的常用方法。
A[mask]=x1、A[~mask]=x2,或者有时是np.where(condition, x1, x2)。 -
为了让这个问题更具吸引力,您需要添加一个工作示例,我们可以复制粘贴并使用它。试图从一个词的描述中得到所有的细节是太多的工作。
-
如果没有
0s,sum(Arg==0) == 0会给你一个True。或者,如果您想用 1 替换所有 0 值:Arg[Arg==0]=1 -
感谢您的回复! @Swier:是的,但这并不能帮助我解决我的方程式。如果
Arg中有0,我仍然必须对Arg中的其余值使用Solution1,对0s 使用Solution2。 @hpaulj:我现在就试试这个!
标签: python arrays python-3.x numpy