python - 对 numpy 数组执行复杂的条件运算

标签 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 的数量应该分配给B0.1 * (0.2/ (0.2 + 0.3))C 中单元格的值乘以 B 的分数与 totalA + B 。新计算的值存储在 2D 中名为 C_B 的数组

  2. 同样,C的金额应该分配给A0.1 * (0.3/(0.2 + 0.3)) 。新计算的值存储在 2D 中名为 C_A 的数组.

  3. 我们对数组 B 中最小值所在的单元格重复此过程。 ,将新计算的结果存储在2D中数组 B_CB_A分别。

  4. 我们对数组 A 中最小值所在的单元格重复此过程。 ,将新计算的结果存储在2D中数组 A_CA_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/

相关文章:

python - 浏览器中的图像缓存 - app-engine-patch 应用程序

python根据字符串位置 move 字符

python - 快速半正弦逼近(Python/Pandas)

python - 如果 Dataframe 中的行包含某些字符串删除

python - 如何在具有通用浮点类型的cython中声明一个ndarray

python - 数值数组的 Numpy 对象数组

python - 如何使用 lxml 以编程方式实例化注释元素?

Python:查找字典的key[value]与其他值的差异并返回差异最小的id

c# - 在Python中使用公共(public)模数和指数进行RSA加密密码

python - Numpy apply_along_axis 推断出错误的数据类型