import numpy as np
mat_a = np.random.random((5, 5))
mat_b = np.random.random((5, 5))
mat_c = np.random.random((5, 5))
假设对于特定的网格单元,3个数组中相同位置的值如下:
mat_a, A = 0.3
mat_b, B = 0.2
mat_c, C = 0.1
在这里,我们发现数值最小的数组,在这种情况下它是C
我们计算C
应分配给B
0.1 * (0.2/ (0.2 + 0.3))
的数量,即C
中的单元格值乘以{{1}的分数} B
为total
。新计算的值存储在名为A + B
2D
数组中
同样,应分配给C_B
的{{1}}金额为C
。新计算的值存储在名为A
的{{1}}数组中。
我们对数组0.1 * (0.3/(0.2 + 0.3))
中值最小的单元格重复此过程,将新计算的结果分别存储在2D
数组C_A
和B
中。< / p>
我们对数组2D
中值最小的单元格重复此过程,将新计算的结果分别存储在B_C
数组B_A
和A
中。< / p>
我能想到这样做的唯一方法是使用嵌套for循环,但这对于较大的数组而言并不是非常pythonic。有快速和pythonic的解决方案吗?
- 编辑
2D
应包含0,其中A_C
不包含最小值
答案 0 :(得分:2)
一种解决方案是计算所有值,用零替换不需要的值。
mat_a = np.random.random((5, 5))
mat_b = np.random.random((5, 5))
mat_c = np.random.random((5, 5))
bigmat = np.stack((mat_a, mat_b, mat_c)) # this is a 3, 5, 5 array
minima = np.argmin(bigmat, axis=0) # contains a 5x5 array of 0,1,2 for a,b,c respectively
c_a = mat_c * mat_a / (mat_b + mat_c)
c_a[minima != 2] = 0
您可以为其他5个答案阵列重复此操作。或者,您也可以这样做:
c_a = np.zeros((5,5))
c_a[minima == 2] = (mat_c * mat_a / (mat_b + mat_c))[minima == 2]