我想创建一个代码与以下规则。
#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]。这些是每个样本集的每个a和R的预期计算。
下面是代码:
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]])
有谁能帮忙修改一下代码吗?
1条答案
按热度按时间rggaifut1#
当你使用NumPy时,你应该充分利用它的潜力,包括使用它的矢量化操作来避免python中的循环。
看起来
p1
、p2
等是p
数组的 * 列 *,因此创建该数组:现在,
a
数组只是p >= c
,转换为整数(您甚至不需要将其转换为整数,因为numpy将True值视为1,False值视为0)如果确实希望
a
作为整数数组,请使用最后,进行计算:
更好的是,要认识到
R
的每个元素都是p
和c
的对应元素中较大的一个,因此只需使用np.maximum
即可,这会得到相同的结果在线试用