2017-05-03 119 views
3

我有很多元素非常小的一個大矩陣,而我認爲這些元素爲0。在數學,有一個叫Chop功能:python是否在Mathematica中具有類似於「Chop」的功能?

Chop[expr]expr是接近 替代近似實數通過精確的整數零0

詳細

  • Chop[expr,delta]內容替換數字在絕對值比小減去0.
  • Chop使用默認公差10 -10

因此我想問一下在Python中是否有這樣的函數。

+4

的[設定非常低的值在零numpy的]可能的複製(http://stackoverflow.com/questions/14419290/set-very-low-values-to-zero-in-numpy) – Julien

+2

@Julien不過,你不知道海報是否使用numpy。 – pvg

+3

@pvg問題是關於Python中的一個大矩陣。除非有很好的理由,否則標準建議是使用numpy。 –

回答

4

有這個沒有內置的功能,但你可以很容易地創建一個自己:

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

調用,這將小於或等於所有的數字轉換成0.30

>>> 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

你的功能正好相反,它們取代了0個遠離零的元素。此外,它們用於標量值,而OP則要求提供將矩陣作爲輸入的函數。 – arekolek

-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] 
+0

[使用numpy已經有一個很好的答案](http://stackoverflow.com/a/14419318/2505645),但OP從未提及他使用numpy,所以你不應該指望他。如果事後證明他是,那麼這是一個重複的問題,應該關閉。 –

+0

幫助頁面聲稱「每當你遇到一個非常草率的,沒有付出努力的帖子,或者一個明顯而且可能危險不正確的答案時,使用你的低估。」我想知道哪一個適用於這個答案。 – arekolek

+0

@arekolek懸停在downvote按鈕上時的工具提示顯示「此答案無用」。如果馬庫斯或其他人認爲這個答案沒有用,他們可以自由下注。 – NobodyNada

相關問題