numpy For循环和if值“a”以获取“R”

rryofs0p  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(128)

我想创建一个代码与以下规则。

#Rule

if p[i] ≥ c[i], then a[i] = 1
if p[i] < c[i], then a[i] = 0

R = a[i]*p[i] + (1-a[i])*c[i]

对于三个样本集的所有i = 1、2、3、4,存在p[i]和c[i]。这些是每个样本集的每个aR的预期计算。

下面是代码:

import numpy as np

p1 = [100,20,40]
p2 = [30,110,30]
p3 = [250,33,28]
p4 = [50,90,135]

c1 = [70,80,40]
c2 = [65,190,120]
c3 = [120,33,80]
c4 = [50,75,200]

p = [p1, p2, p3, p4]
c = [c1, c2, c3, c4]

n = len(p)

storage_R = []
storage_a = []

for i in range(0,n):

    if p[i] >= c[i]:
        a = 1
    else:
        a = 0 

    R = a*p[i] + (1-a)*c[i]
    storage_a.append(a)
    storage_R.append(R)

T = np.array(storage_R).transpose()

但是,结果如下。

storage_a = [1, 0, 1, 1]

storage_R = [[100, 20, 40], [65, 190, 120], [250, 33, 28], [50, 90, 135]]

T = array([[100,  65, 250,  50],
       [ 20, 190,  33,  90],
       [ 40, 120,  28, 135]])

预期结果为:

#expected result

storage_A = [[1, 0, 1], [0, 0, 0], [1, 1, 0], [1, 1, 0]]
storage_R = [[100, 80, 40], [65, 190, 120], [250, 33, 80], [50, 90, 200]]

T = array([[100,  65, 250,  50],
          [ 80, 190,  33,  90],
          [ 40, 120,  80, 200]])

有谁能帮忙修改一下代码吗?

rggaifut

rggaifut1#

当你使用NumPy时,你应该充分利用它的潜力,包括使用它的矢量化操作来避免python中的循环。
看起来p1p2等是p数组的 * 列 *,因此创建该数组:

>>> p = np.array([p1, p2, p3, p4]).T
[[100  30 250  50]
 [ 20 110  33  90]
 [ 40  30  28 135]]

>>> c = np.array([c1, c2, c3, c4]).T
[[ 70  65 120  50]
 [ 80 190  33  75]
 [ 40 120  80 200]]

现在,a数组只是p >= c,转换为整数(您甚至不需要将其转换为整数,因为numpy将True值视为1,False值视为0)

>>> a = p >= c
[[ True False  True  True]
 [False False  True  True]
 [ True False False False]]

如果确实希望a作为整数数组,请使用

>>> a = (p >= c).astype(int)
[[1 0 1 1]
 [0 0 1 1]
 [1 0 0 0]]

最后,进行计算:

>>> R = a*p + (1-a)*c
[[100  65 250  50]
 [ 80 190  33  90]
 [ 40 120  80 200]]

更好的是,要认识到R的每个元素都是pc的对应元素中较大的一个,因此只需使用np.maximum即可,这会得到相同的结果

>>> R = np.maximum(p, c)

在线试用

相关问题