计算numpy memmap Infinity输出的均值和方差

Abh*_*tia 2 python memory numpy

创建memmap数组:

  out = np.memmap('my_array.mmap', dtype=np.float16, mode='w+', shape=(num_axis1, num_axis2))
  for index,row in enumerate(temp_train_data):
        __,cd_i=pywt.dwt(X_train[index:index+1001].ravel(),'haar')
        out[index]=(cd_i)
(Pdb) out.shape
(1421392L, 3504L)
Run Code Online (Sandbox Code Playgroud)

现在,我只是对这个数组进行扩展.减去均值并除以方差.

np.mean(out[:,1])
memmap(inf, dtype=float16)
Run Code Online (Sandbox Code Playgroud)

输出是 memmap(inf, dtype=float16) 我不明白为什么!

可重复的例子:

import numpy as np
ut = np.memmap('my_array.mmap', dtype=np.float16, mode='w+',\
  shape=(140000, 3504))
for index,row in enumerate(ut):
    ut[index]=np.random.rand(1,3504)*10
print np.max(ut[:,1])
print np.mean(ut[:,1],axis=0)
Run Code Online (Sandbox Code Playgroud)

10.0

INF

Kev*_*vin 7

根据维基百科,float16数据类型无法处理大于65520的整数.集合中所有值的总和可能大于此值,因此在计算平均值时会将其四舍五入为无穷大.

考虑使用具有更高上限的数据类型.例如,float32.

ut = np.memmap('my_array.mmap', dtype=np.float32, mode='w+',\
  shape=(140000, 3504))
Run Code Online (Sandbox Code Playgroud)

当我做这个改变时,我得到一些不错的非无限输出:

9.99996471405
4.9927
Run Code Online (Sandbox Code Playgroud)

或者,如果您确实需要一个float16数组,则可以指定用于计算平均值的类型:

print np.mean(ut[:,1],axis=0,dtype=np.float32)
Run Code Online (Sandbox Code Playgroud)