2013-08-05 33 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

相关问题