在numpy数组

时间:2016-08-31 05:17:30

标签: python numpy

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

  1. 我们计算C应分配给B 0.1 * (0.2/ (0.2 + 0.3))的数量,即C中的单元格值乘以{{1}的分数} Btotal。新计算的值存储在名为A + B

  2. 2D数组中
  3. 同样,应分配给C_B的{​​{1}}金额为C。新计算的值存储在名为A的{​​{1}}数组中。

  4. 我们对数组0.1 * (0.3/(0.2 + 0.3))中值最小的单元格重复此过程,将新计算的结果分别存储在2D数组C_AB中。< / p>

  5. 我们对数组2D中值最小的单元格重复此过程,将新计算的结果分别存储在B_C数组B_AA中。< / p>

  6. 我能想到这样做的唯一方法是使用嵌套for循环,但这对于较大的数组而言并不是非常pythonic。有快速和pythonic的解决方案吗?

    - 编辑

    2D应包含0,其中A_C不包含最小值

1 个答案:

答案 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]