为什么numpy.histogram(Python)与Matlab中的hist相比会少一个元素?

5

我正在尝试将一些Matlab代码转换为Python,而Matlab代码看起来像:

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

其中Isb是一个2048000个元素的一维数组。N作为301个元素的一维数组输出。

我的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()
2个回答

8
请注意,在Matlab的hist(x, vec)中,vec定义了直方图的bin中心,而在Matlab的histc(x, vec)中,vec定义了直方图的bin边缘。Numpy的直方图似乎使用bin边缘。这种差异对您来说重要吗?从一个转换到另一个应该很容易,并且您可能需要在bin-edges的末尾添加额外的Inf,以获取您想要的额外bin。就像这样(未经测试):
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所提供的所有边缘情况,但您已经了解了基本想法。


在底层,hist将所有内容转换为边缘并调用本地函数histc - horchler

1
如上所述,在matlab中,-3:0.01:0指定了301个bin中心。 而在numpy中,您正在做的是指定bin边缘,因此这将比在matlab中少一个bin。
因此,您可以在matlab中从hist移动到histc,或确保在numpy中应用相同的bin边缘。 在这种特殊情况下(等距箱),您也可以像这样使用numpy:
N,X = np.histogram(x, bins = n_bins, range = (xmin, xmax))

在这种情况下:301个n_bins和(xmin,xmax)为(-3.005,0.005)应该等同于matlab的hist。
另请参阅:

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


我需要 X 和 N 具有相同的尺寸,这样我才能执行以下操作: loc = X < -0.75 I = N[loc].argmax() - Teddy_Tort

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接