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
中单元格的值乘以B
的分数与total
是A + B
。新计算的值存储在2D
中名为C_B
的数组同样,
C
的金额应该分配给A
是0.1 * (0.3/(0.2 + 0.3))
。新计算的值存储在2D
中名为C_A
的数组.我们对数组
B
中最小值所在的单元格重复此过程。 ,将新计算的结果存储在2D
中数组B_C
和B_A
分别。我们对数组
A
中最小值所在的单元格重复此过程。 ,将新计算的结果存储在2D
中数组A_C
和A_B
分别。
我能想到的唯一方法是使用嵌套的 for 循环,但这对于较大的数组来说是禁止的,而且不太 Pythonic。有没有快速且Pythonic的解决方案?
--编辑
C_B
应包含 0,其中 mat_c
不包含最小值
最佳答案
一种解决方案是计算所有值,用零替换不需要的值。
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]
关于python - 对 numpy 数组执行复杂的条件运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39241282/