2013-08-05 37 views
4

我想一些Matlab代碼轉換爲Python和Matlab代碼的樣子:與Matlab相比,numpy.histogram(Python)爲什麼會留下一個元素?

[N,X] = hist(Isb*1e6, -3:0.01:0) 

其中ISB是2048000元一維數組。 N被輸出爲301元素1D陣列。

我的Python代碼看起來像:

import numpy as np 
N,X = np.histogram(Isb*1e6,np.array(-3,0.01,0.01)) 

而是N的Python輸出是一個300元件1D陣列,其中從MATLAB n中的最後一個元素是左關閉。

有沒有一種方法可以更準確地複製Matlab的功能?

我需要N和X是相同的大小,這樣我可以做到這一點:

loc = X < -0.75 
I = N[loc].argmax() 

回答

4

注意,在MATLAB的hist(x, vec),VEC difines的濱中心,而在MATLAB histc(x, vec) VEC定義bin-edges的直方圖。 Numpy的直方圖似乎與bin-edges一起工作。這種差異對你很重要嗎?它應該很容易從一個轉換到另一個,並且您可能必須在bin-edges的末尾添加一個額外的Inf以使其返回所需的額外垃圾箱。或多或少像這樣(未經):

import numpy as np 

def my_hist(x, bin_centers): 
    bin_edges = np.r_[-np.Inf, 0.5 * (bin_centers[:-1] + bin_centers[1:]), 
     np.Inf] 
    counts, edges = np.histogram(x, bin_edges) 
    return counts 

爲了確保它不會覆蓋所有的邊緣案件MATLAB的hist提供,但你的想法。

+0

我需要的Python代碼精確複製的Matlab代碼。 – user2635929

+0

引擎蓋下'hist'將所有內容轉換爲邊緣,並調用本地函數'histc'。 – horchler

0

如上所述,在matlab -3:0.01:0中指定了bin-center,即301. 你在numpy中做了什麼指定bin-edges,所以這將是一個比在matlab中更小的bin。

因此,您可以在matlab中從hist移動​​到histc,或者確保您在numpy中應用相同的bin邊緣。 在這種特殊情況下(等距的塊),你也可以使用numpy的是這樣的:

N,X = np.histogram(x, bins = n_bins, range = (xmin, xmax)) 

在這種情況下:301和(XMIN,XMAX)n_bins是(-3.005,0.005)應該等於MATLAB的HIST 。

參見:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html

+0

我需要X和N的大小相同,所以我可以執行以下操作: 'loc = X <-0.75' 'I = N [loc] .argmax()' – user2635929

相關問題