高效地逼近数组

2024-05-17 18:43:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个表单数组

[-0.87336,0.18776,1.00000,0.56449,-0.27645]

我想把它转换成一个数组的形式

[-1.0,0.0,1.0,1.0,0.0]

遵循这样一条规则:如果初始数组的元素i小于或等于-0.5,则为其分配数字-1.0;如果在区间(-0.5,0.5)内,则为其指定值0.0,最后,如果大于或等于0.5,则为其指定值1.0

我试着定义一个函数

def modulator(x):
    if -0.5<x<0.5:
        return 0
    elif 0.5<=x:
         return 1
    else:
         return -1

然后我用for循环做了这个作业

array_new = []
for el in array:
    ell = [modulator(i) for i in el]
    array_new.append(ell)

有没有更优雅的Python式方法? 我考虑过np.where(),但我不知道如何处理多个条件


Tags: in元素表单newforreturn规则数字
3条回答

您可以使用内置的^{}函数来实现这一点

lst = [-0.87336,0.18776,1.00000,0.56449,-0.27645]
lst= [float(round(i)) for i in lst]
[-1.0, 0.0, 1.0, 1.0, 0.0]

在numpy中,您可以使用np.round

x = np.array([-0.87336,0.18776,1.00000,0.56449,-0.27645])

x.round()

其中:

array([-1.,  0.,  1.,  1., -0.])

如果您不喜欢-0.,可以添加0.

x.round() + 0.
array([-1.,  0.,  1.,  1., 0.])

如果您的输入超出了round将直接起作用的范围(示例中的值介于-1和+1之间,但如果它们远远超出此范围),您可以首先使用clip

x = np.array([-2.87336, -.501, 7.18776, 99.00000, 0.499, 0.56449,-87.27645])

np.round( np.clip(x, -1, 1)) + 0.

array([-1., -1.,  1.,  1.,  0.,  1., -1.])

作为检查,我运行了以下内容以覆盖我不确定的边界:

x = np.array([-0.87336, -.501, -.499, 0.18776, 1.00000, 0.499, 0.56449,-0.27645])

array([-1., -1.,  0.,  0.,  1.,  0.,  1.,  0.])

您可以使用np.select(这将处理大于1和小于-1的值,如果舍入失败):

a = np.array([-0.87336,0.18776,1.00000,0.56449,-0.27645])
np.select((a<=-0.5, a>=0.5),(-1.0,1.0),0.0)
#[-1.  0.  1.  1.  0.]

相关问题 更多 >