python在Mathematica中是否具有类似“Chop”的功能?

时间:2017-05-03 05:15:31

标签: python python-3.x

我有一个很大元素的大矩阵,我认为这些元素为0.在Mathematica中,有一个名为Chop的函数:

  

Chop[expr]替换expr中接近的近似实数   零乘以整数0。

     

详细

     
      
  • Chop[expr,delta]将绝对幅度小于delta的数字替换为0。
  •   
  • Chop使用默认容差10 -10
  •   

因此我想问一下Python中是否有这样的函数。

2 个答案:

答案 0 :(得分:4)

此处没有内置功能,但您可以轻松自己创建一个:

def chop(expr, *, max=0.3):
    return [i if i > max else 0 for i in expr]

调用此方法会将所有小于或等于0.3的数字转换为0

>>> chop([1.0, 0.2, 0.4, 0.3, 0.31])
[1.0, 0, 0.4, 0, 0.31]

您应该将max的默认值更改为更适合您需求的内容,但您也可以针对单个调用单独更改它:

>>> chop([0.2, 0.3, 0.4], max=0.25)
[0, 0.3, 0.4]
>>> chop([0.3, 1, 2, 3], max=2)
[0, 0, 0, 3]

如果你愿意,你也可以转换负数!对正数和负数使用相同的零距离:

def chop(expr, *, max=0.3):
    return [i if abs(i) > max else 0 for i in expr]

或者使用两个不同的限制:

def chop(expr, *, max=0.3, min=-0.3):
    if max < min:
        raise ValueError
    return [
        i if i > max or i < min else 0
        for i in expr
    ]

答案 1 :(得分:-1)

使用numpy的一种方法是使用蒙面数组:

>>> import numpy
>>> def chop(expr, delta=10**-10):
...     return numpy.ma.masked_inside(expr, -delta, delta).filled(0)

>>> x = numpy.fft.irfft(numpy.fft.rfft([2, 1, 1, 0, 0, 0]))

>>> x
array([  2.00000000e+00,   1.00000000e+00,   1.00000000e+00,
         3.20493781e-17,  -4.44089210e-16,  -3.20493781e-17])

>>> chop(x)
array([ 2.,  1.,  1.,  0.,  0.,  0.])

如果你真的不想因某些原因使用numpy,那么这里有一个适用于标量值,列表和多维列表(矩阵)的函数:

def chop(expr, delta=10**-10):
    if isinstance(expr, (int, float, complex)):
        return 0 if -delta <= expr <= delta else expr
    else:
        return [chop(x) for x in expr]