4

我正在尝试将一些 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 个元素的一维数组,其中 Matlab N 中的最后一个元素被省略了。

有没有办法更准确地复制 Matlab 所做的事情?

我需要 N 和 X 的大小相同,这样我才能做到这一点:

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

2 回答 2

5

请注意,在 matlab 中hist(x, vec),vec 定义了bin-centers,而在 matlab 中,histc(x, vec)vec 定义了直方图的bin-edge。Numpy 的直方图似乎适用于bin-edges。这种差异对您来说重要吗?从一个转换到另一个应该很容易,并且您可能需要Inf在 bin-edges 的末尾添加一个额外的内容,以使其返回您想要的额外 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

当然,它并没有涵盖 matlabhist提供的所有边缘情况,但你明白了。

于 2013-08-05T19:24:58.090 回答
0

如上所述,在 matlab -3:0.01:0 中指定 bin-centers,即 301。您在 numpy 中所做的指定 bin-edges,因此这将比在 matlab 中少一个 bin。

因此,您可以在 matlab 中从 hist 移动到 histc,或者确保在 numpy.xml 中应用相同的 bin-edges。在这种特殊情况下(等距箱),您还可以像这样使用 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

于 2013-08-05T19:45:13.940 回答