在python中,如何替换数组中高于上限或低于下限的数字?

在python中,如何替换数组中高于上限或低于下限的数字?,python,numpy,Python,Numpy,我试图从分布中随机生成数字。不在我要替换的平均值的两个标准偏差内的数字,因此最终数组中的所有数字都在这个范围内。这是我目前掌握的代码: mean = 150 COV = 0.4 sd = COV*mean upper_limit = mean + 2*sd lower_limit = mean - 2*sd capacity = np.random.normal(mean, sd, size = (1,96)) for x in capacity: while x > upper_

我试图从分布中随机生成数字。不在我要替换的平均值的两个标准偏差内的数字,因此最终数组中的所有数字都在这个范围内。这是我目前掌握的代码:

mean = 150
COV = 0.4
sd = COV*mean
upper_limit = mean + 2*sd
lower_limit = mean - 2*sd
capacity = np.random.normal(mean, sd, size = (1,96))
for x in capacity:
    while x > upper_limit:
        x = np.random.normal(mean, sd, size = 1)
    while x < lower_limit:
        x = np.random.normal(mean, sd, size = 1)
mean=150
COV=0.4
sd=COV*平均值
上限=平均值+2*sd
下限=平均值-2*sd
容量=np.随机.正常(平均值,标准差,大小=(1,96))
对于容量为x的设备:
当x>上限时:
x=np.随机.正常(平均值,标准差,大小=1)
当x<下限时:
x=np.随机.正常(平均值,标准差,大小=1)
但是,我得到了错误消息
ValueError:包含多个元素的数组的真值是不明确的。使用a.any()或a.all()


有人能帮忙解决这个问题吗?

我认为您应该将
大小
参数从
(1,96)
更改为
96
。因为这里的
x
具有形状
(96,)
因此是一个数组,因此不能与单个浮点值相比。

我认为您应该将
大小
参数从
(1,96)
更改为
96
。因为这里您的
x
具有形状
(96,)
因此是一个数组,因此无法与单个浮点值进行比较。

不要迭代
numpy
数组来对数组的每个元素执行操作。使用
numpy
的全部目的是通过从不迭代来加快速度

要检查
容量
中大于
上限
的所有值,只需执行以下操作:

capacity > upper_limit
然后,您可以通过以下方式获得这些项目的索引:

too_high_indices = np.where(capacity > upper_limit)
然后,您可以生成一个新的随机数组来分配给所有这样的对象,例如

capacity[too_high_indices] = np.random.normal(mean, sd, size=len(too_high_indices))
最后,您可以这样做:

too_high_indices = np.where(capacity > upper_limit)
while np.any(too_high_indices):
    capacity[too_high_indices] = np.random.normal(
        mean, sd, size=len(too_high_indices))
    too_high_indices = np.where(capacity > upper_limit)
然后重复下限


这样,即使大小增加,速度也会相对较快。

不要迭代
numpy
数组来对数组的每个元素执行操作。使用
numpy
的全部目的是通过从不迭代来加快速度

# print(capacity)
# changed = set([])
for i in range( len(capacity[0]) ):
    while capacity[0][i] > upper_limit or capacity[0][i] < lower_limit:
        capacity[0][i] = np.random.normal(mean, sd, size = 1)[0]
        # changed.add(i)
# print(capacity)
# print(changed)
要检查
容量
中大于
上限
的所有值,只需执行以下操作:

capacity > upper_limit
然后,您可以通过以下方式获得这些项目的索引:

too_high_indices = np.where(capacity > upper_limit)
然后,您可以生成一个新的随机数组来分配给所有这样的对象,例如

capacity[too_high_indices] = np.random.normal(mean, sd, size=len(too_high_indices))
最后,您可以这样做:

too_high_indices = np.where(capacity > upper_limit)
while np.any(too_high_indices):
    capacity[too_high_indices] = np.random.normal(
        mean, sd, size=len(too_high_indices))
    too_high_indices = np.where(capacity > upper_limit)
然后重复下限

这样,即使尺寸增大,打印速度也会相对较快。

#打印(容量)
# print(capacity)
# changed = set([])
for i in range( len(capacity[0]) ):
    while capacity[0][i] > upper_limit or capacity[0][i] < lower_limit:
        capacity[0][i] = np.random.normal(mean, sd, size = 1)[0]
        # changed.add(i)
# print(capacity)
# print(changed)
#更改=设置([]) 对于范围内的i(len(容量[0]): 而容量[0][i]>上限或容量[0][i]<下限: 容量[0][i]=np.随机.正态(平均值,标准差,大小=1)[0] #已更改。添加(i) #打印(容量) #打印(已更改)
#打印(容量)
#更改=设置([])
对于范围内的i(len(容量[0]):
而容量[0][i]>上限或容量[0][i]<下限:
容量[0][i]=np.随机.正态(平均值,标准差,大小=1)[0]
#已更改。添加(i)
#打印(容量)
#打印(已更改)

是不是容量
是一个矩阵,所以容量
中的每个
x
都是一行,但你把它当作一个单独的元素?是不是容量
是一个矩阵,容量
中的每个
x
都是一行,但是你把它当作一个单独的元素吗?只要验证我的答案,然后plz:)很高兴它能帮上忙。我刚刚意识到,虽然改变大小允许代码运行,它没有替换两个标准偏差之外的任何值只是验证我的答案然后请注意:)很高兴它能帮助我刚刚意识到,虽然更改大小允许代码运行,但它没有替换两个标准偏差之外的任何值这确实有效,谢谢!这确实有效,谢谢!