如何计算两个不同的numpy数组的值,然后将结果放入第三个数组

时间:2018-12-06 01:34:36

标签: python arrays numpy

我需要计算两个numpy数组以获得第三个数组所需的行为。

首先,这是前两个数组:

[[2 0 1 3 0 1]
 [1 2 1 2 1 2]       # ARRAY 1
 [2 1 2 1 0 1]
 [0 2 0 2 2 3]
 [0 3 3 3 1 4]
 [2 3 2 3 1 3]]

[[0.60961197 0.29067687 0.20701799 0.79897639 0.74822711 0.21928105]
[0.67683562 0.14261662 0.74655501 0.21529103 0.14347939 0.42190162]
[0.21116134 0.98618323 0.93882545 0.51422862 0.12715579 0.18808092]    # ARRAY 2
[0.48570863 0.32068082 0.32335023 0.62634641 0.37418013 0.44860968]
[0.12498966 0.56458377 0.24902924 0.12992352 0.76903935 0.68230202]
[0.90349626 0.75727838 0.14188677 0.63082553 0.96360265 0.28694261]]

其中array1 [0] [0]将用于从array3 [0] [0]减去输入值,然后array2 [0] [0]将与从array3 [0]减去的值相乘] [0]给出array3 [1] [0]的新输出(换句话说,这些计算将得到array3)。

例如,假设array3 [0]的起始值为:

[[20,22,24,40,42,10],
  ....

对于array3 [0] [0](20),它需要减去2(来自array1 [0] [0]),将值保留为18。然后,将 NOW乘以 strong>乘以0.60961197(array2 [0] [0]),保留新值10.97 10.97现在是array3 [1] [0]的新值。

如果要移至下一列,则过程将相同。您将采用22-0 = 22,然后采用22 * 0.29067687为array3 [1] [1]创建新值。

为了提供直观的示例,此数组在前两行中的完整过程如下所示:

      [[20 22 24 40 42 10],
     [10.97  19.65 7.44 10.58 7.03],
      ....

我正在尝试使此过程在第一个数组的整个长度上继续进行(我猜是第二个,因为它们相同)。因此,对于下一组,您将为每个索引取10.97-1 * 0.6768 ... = 6.74 ..以此类推,直到到达末尾。

我对此一无所知,我曾尝试过for循环,但我觉得在numpy中可能有很多有效的方法。

我非常感谢您的帮助,我知道这并不容易(或者可能会做到!)。这将开始对我来说是一个相当漫长的项目。

非常感谢您!

注意:如果numpy数组不是解决此问题的好方法,并且可以说列表更好,那么我非常愿意这样做。我只是假设使用numpy的大多数功能,这会更容易。

2 个答案:

答案 0 :(得分:0)

如果我正确理解,您可以执行以下操作:

import numpy as np

np.random.seed(42)

arr1 = np.array([[2, 0, 1, 3, 0, 1],
                 [1, 2, 1, 2, 1, 2],
                 [2, 1, 2, 1, 0, 1],
                 [0, 2, 0, 2, 2, 3],
                 [0, 3, 3, 3, 1, 4],
                 [2, 3, 2, 3, 1, 3]])

arr2 = np.array([[0.60961197, 0.29067687, 0.20701799, 0.79897639, 0.74822711, 0.21928105],
                 [0.67683562, 0.14261662, 0.74655501, 0.21529103, 0.14347939, 0.42190162],
                 [0.21116134, 0.98618323, 0.93882545, 0.51422862, 0.12715579, 0.18808092],
                 [0.48570863, 0.32068082, 0.32335023, 0.62634641, 0.37418013, 0.44860968],
                 [0.12498966, 0.56458377, 0.24902924, 0.12992352, 0.76903935, 0.68230202],
                 [0.90349626, 0.75727838, 0.14188677, 0.63082553, 0.96360265, 0.28694261]])

arr3 = np.random.randint(5, 30, size=(6, 6))

result = (arr3 - arr1) * arr2

print(result)

输出

[[ 5.48650773  6.97624488  3.72632382  9.58771668  8.97872532  5.2627452 ]
 [ 6.7683562   2.99494902 19.41043026  2.79878339  2.00871146 10.96944212]
 [ 4.85671082  6.90328261  9.3882545  13.88417274  0.89009053  4.702023  ]
 [12.14271575  1.28272328  9.05380644  8.76884974  2.99344104  1.34582904]
 [ 3.1247415   1.12916754  3.23738012  2.98824096 11.53559025 17.0575505 ]
 [17.16642894  8.33006218  2.55396186 10.09320848 17.3448477   5.7388522 ]]

如果将其应用于示例数据,则会得到:

arr3 = np.array([20, 22, 24, 40, 42, 10])
result = (arr3 - arr1[0]) * arr2[0]
print(result)

输出

[10.97301546  6.39489114  4.76141377 29.56212643 31.42553862  1.97352945]

请注意,在第二个示例中,我仅使用arr2arr3中的第一行。

答案 1 :(得分:0)

只需将我的评论扩展到完整答案即可。问题是谈论两种“重复”:

  • 并行执行(列方式,可广播)
  • 不可并行执行(逐行迭代)

numpy可以很好地处理广播(即列方向),因此只需在行方向上使用for循环即可:

for i in range(len(array1)):
    array3[i+1] = (array3[i] - array1[i]) * array2[i]

请注意,array3的长度应大于array1array2的长度,否则没有意义。

编辑

糟糕,我没有看到您要避免for循环。从技术上讲,您可以在没有for循环的情况下解决此问题,但是您需要自己弄乱线性代数:

为方便起见,如果我们将array1命名为a,将array2命名为b,并将array3的第一行命名为carray3的行将是:

  • c
  • (c-a0)*b0 = c*b0-a0*b0
  • ((c-a0)*b0-a1)*b1 = c*b0*b1-a0*b0*b1-a1*b1
  • ...

然后array3的最后一行可以计算为

B = b[::-1].cumprod(0)[::-1]
final_c = c * B[0] - (B * a).sum(0)

如果您想要整个array3,那么没有for循环并不是一件容易的事。您也许可以编写它,但是阅读和编写都很麻烦。效果也值得怀疑