我需要计算两个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的大多数功能,这会更容易。
答案 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]
请注意,在第二个示例中,我仅使用arr2
和arr3
中的第一行。
答案 1 :(得分:0)
只需将我的评论扩展到完整答案即可。问题是谈论两种“重复”:
numpy
可以很好地处理广播(即列方向),因此只需在行方向上使用for循环即可:
for i in range(len(array1)):
array3[i+1] = (array3[i] - array1[i]) * array2[i]
请注意,array3
的长度应大于array1
或array2
的长度,否则没有意义。
编辑
糟糕,我没有看到您要避免for循环。从技术上讲,您可以在没有for循环的情况下解决此问题,但是您需要自己弄乱线性代数:
为方便起见,如果我们将array1
命名为a
,将array2
命名为b
,并将array3
的第一行命名为c
。 array3
的行将是:
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循环并不是一件容易的事。您也许可以编写它,但是阅读和编写都很麻烦。效果也值得怀疑