小编Dom*_*ise的帖子

如何使用 matplotlib 模拟 plt.hist 绘制 np.histogram 的结果

我喜欢这样绘制直方图:

data = [-0.5, 0.5, 0.5, 0.5, 
    1.5, 2.1, 2.2, 2.3, 2.4, 2.5, 3.1, 3.2]

plt.hist(data, bins=5, range=[-1, 4], histtype='step')
Run Code Online (Sandbox Code Playgroud)

现在,当我有某种大的输入数据(大于我的内存)时,我需要逐块填充直方图。例如像这样:

H, bins = np.histogram([], bins=5, range=[-1, 4])
for data in a_lot_of_input_files:
    H += np.histogram(data, bins=5, range=[-1, 4])[0]
Run Code Online (Sandbox Code Playgroud)

但问题始终是,“我如何H再次绘制它,使其看起来就像以前的 matplotlib 版本。

我想出的解决方案如下所示:

plt.plot(bins, np.insert(H, 0, H[0]), '-', drawstyle='steps')
Run Code Online (Sandbox Code Playgroud)

绘制直方图的两种不同版本。

但是,看起来结果并不相同,创建H用于绘制它的副本的感觉也不是很好。

我缺少一些优雅的解决方案吗?(我还没有尝试使用plt.bar,因为当想要比较直方图时,条形图不能很好地工作)

python numpy matplotlib

11
推荐指数
1
解决办法
2万
查看次数

压缩文件上有效的numpy.fromfile?

我有一些大的(甚至是大约10GB的压缩文件)文件,其中包含一个ASCII标头,然后原则上每个大约3MB的numpy.recarrays,我们称之为"事件".我的第一个方法看起来像这样:

f = gzip.GzipFile(filename)
f.read(10000) # fixed length ascii header
event_dtype = np.dtype([
        ('Id', '>u4'),                # simplified
        ('UnixTimeUTC', '>u4', 2), 
        ('Data', '>i2', (1600,1024) ) 
        ])
event = np.fromfile( f, dtype = event_dtype, count=1 )
Run Code Online (Sandbox Code Playgroud)

但是,这是不可能的,因为np.fromfile需要一个真正的FILE对象,因为它确实进行了低级别的调用(找到了一个相当旧的票据https://github.com/numpy/numpy/issues/1103).

据我了解,我必须这样做:

s = f.read( event_dtype.itemsize )
event = np.fromstring(s, dtype=event_dtype, count=1)
Run Code Online (Sandbox Code Playgroud)

是的,它有效!但这不是非常低效吗?是不是分配了内存,为每个事件收集垃圾?在我的笔记本电脑上,我达到了16个事件/秒,即~50MB/s

我想知道是否有人知道一个聪明的方法,分配mem一次然后让numpy直接读入该mem.

顺便说一句.我是一名物理学家,所以...还是这个行业的新手.

python zip numpy fromfile

9
推荐指数
1
解决办法
1913
查看次数

在numpy.sum()或mean()之前有效的numpy.roll

我有几个(1000个订单)3D形状阵列(1000,800,1024)我想学习.我需要计算沿轴= 0的平均值,但在我能做到之前,我必须沿着轴2滚动数据,直到它"在正确的位置".

这听起来很奇怪,所以我会试着解释一下.形状(1024,)的1D子阵列是来自物理环形缓冲器的数据.我知道,环形缓冲区以不同的方式读出.所以我有几个pos形状阵列(1000,800).告诉我环读缓冲区被读出的位置.我的3D data形状阵列(1000,800,1024)我需要根据它滚动pos.

只有在滚动之后...... 3D阵列对我来说才有意义,我可以开始分析它们.在C可以写出这是做这个非常简单的代码,所以我不知道如果我可以种在的结束"告诉"的numpy的平均值()或SUM(),他们应该在不同的指数开始例程和"打滚" 1D-子阵列.

我目前做的是这样的:

rolled = np.zeros_like(data) # shape (1000, 800, 1024)
for a in range(rolled.shape[0]):
    for b in range(rolled.shape[1]):
        rolled[a,b] = np.roll(data[a,b], pos[a,b])
Run Code Online (Sandbox Code Playgroud)

这需要大约60秒然后我做,例如:

m = rolled.mean(axis=0)
s = rolled.std(axis=0)
Run Code Online (Sandbox Code Playgroud)

这只需要15秒左右.

我的观点是,使轧制副本需要花费很多的时间和空间(好吧,我可以通过写卷的东西放回节省空间data),而肯定是有办法(C语言)来实现这种平均在一个循环滚动因此节省了大量时间.我的问题是......如果有办法与numpy做类似的事情?

python numpy

8
推荐指数
1
解决办法
1251
查看次数

标签 统计

numpy ×3

python ×3

fromfile ×1

matplotlib ×1

zip ×1