python在Mathematica中有类似的“Chop”功能吗?

2024-06-01 14:46:48 发布

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

我有一个很大的矩阵,有很多非常小的元素,我认为这些元素是0。在Mathematica中,有一个名为^{}的函数:

Chop[expr] replaces approximate real numbers in expr that are close to zero by the exact integer 0.

Details

  • Chop[expr,delta] replaces numbers smaller in absolute magnitude than delta by 0.
  • Chop uses a default tolerance of 10-10.

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


Tags: 函数in元素bythat矩阵realare
2条回答

使用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,那么这里有一个用于标量值、列表和多维列表(矩阵)的函数:

^{pr2}$

虽然没有内置函数,但您可以轻松地自己创建一个:

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

调用此函数将把所有小于或等于0.3的数字转换为0

^{pr2}$

您应该将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
    ]

相关问题 更多 >