用数组生成三项树 - Python

0 投票
1 回答
1034 浏览
提问于 2025-04-18 02:39

我遇到了一个很简单的问题,但不知道怎么解决。我有以下代码:

r = [np.array([100])]
for i in range(2):
  r.append(np.concatenate((r[-1][:1]*1.5, r[-1]*0.5)))

每次运行这个代码时,会产生:

[array([100]), array([ 150.,   50.])]

[array([100]), array([ 150.,   50.]), array([ 225.,   75.,   25.])]

这个代码的目的是生成一个类似于二项树的结构,向上变动1.5,向下变动0.5。所以从100开始,我们可以上升到150,下降到50。在下一个时间点,从150可以变成225或者75;而从50可以变成75或者25。

但是现在……我想用这个来生成一个三项树。也就是说,向上变动1.5,中间保持不变(也就是1),向下变动0.5。

所以每次迭代应该产生:

[array([100]), array([ 150., 100.,  50.])]

[array([100]), array([ 150.,  100., 50.]), array([ 225., 150., 75., 150., 100., 75., 75., 50., 25. ])]

这会生成一种非重组的结构。但我不知道怎么修改代码才能实现这个目标。我得到的最接近的结果是:

r.append(np.concatenate((r[-1][:1]*1.5,r[-1][:1]*1, r[-1]*0.5)))

但是这并没有产生预期的结果:

[array([100]), array([ 150.,  100.,   50.]), array([ 225.,  150.,   75.,   50.,   25.])]

谢谢你!

1 个回答

0

因为第一个是重组的,所以“上面的下”和“下面的上”产生的结果是一样的,因此代码中忽略了其中一个。

你想要的是一个不重组的结构,所以需要考虑所有的结果,改变这个会产生你想要的结果:

for i in range(2):
  r.append(np.concatenate((r[-1]*1.5, r[-1], r[-1]*0.5)))

>>> r
[array([100]), array([ 150.,  100.,   50.]), array([ 225.,  150.,   75.,  150.,  100.,   50.,   75.,   50.,   25.])]

它的作用是取前一个数组(r[-1]),然后用你想要的3倍数去乘,再用concat()把这三个结果合在一起。

撰写回答