【问题标题】:Array indexing by array-value and array-value dependant operation通过数组值和数组值相关操作进行数组索引
【发布时间】: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 形状相同的阵列中获得电池的热导率(仅取决于电池的温度)?比如TCT_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]=x1A[~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


【解决方案1】:

试试这个:

[a,b,c] = [1,2,3]
Arg = numpy.array([[0.12],[0.9],[0],[0],[0.2]])
Solution = Arg
Solution[Solution ==0] = 1
Solution = Solution * a * b * c
print(Solution)

返回:

[[ 0.72]
 [ 5.4 ]
 [ 6.  ]
 [ 6.  ]
 [ 1.2 ]]

不要试图将Arg中的0值排除在乘法之外,只需将它们更改为1,这在乘法中是中性的,因此与避免乘法具有相同的效果。

【讨论】:

  • 感谢您的回答!不幸的是,要求解的实际方程要复杂一些。我在我的问题中添加了一个简化的简约方程,它显示了基本结构。很抱歉之前这样做了!
  • @Scotty1- 可以先做一个数组results = numpy.zeros(len(Arg)),然后分两步填充:results[Arg==0] = Equation1(Arg[Arg==0]),然后results[Arg!=0] = Equation2(Arg[Arg!=0])
  • 非常感谢 Swier,做到了!我刚刚用 hpaulj 的 np.where 解决方案尝试了它,并且效果也很好......还有两个问题:如果我切换到 2d 数组(或 3d),哪个解决方案会更好,哪个更快?跨度>
  • 我之前一直在matlab中使用布尔掩码,但我没有设法在python中做到这一点......看起来我仍然需要习惯python...... :-/有没有一种也支持 hpaulj 答案的方法?
  • numpy.where 和掩码数组的速度应该大致相同。虽然如果您的数据集变得非常大,您可能想尝试查看 scipy 和/或 pandas 并可能预编译您的脚本,但这是另一个问题。在他的评论的左上角应该有一个小箭头,你可以用它来投票。
猜你喜欢
  • 2018-05-02
  • 2014-01-15
  • 2018-07-26
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 2016-03-25
相关资源
最近更新 更多