小编nah*_*var的帖子

使用numpy计算成对互信息的最佳方法

对于mxn矩阵,计算所有列对(nxn)的互信息的最佳(最快)方法是什么?

通过互信,我的意思是:

I(X,Y)= H(X)+ H(Y) - H(X,Y)

其中H(X)是指的香农熵X.

目前我正在使用np.histogram2dnp.histogram计算关节(X,Y)和个体(X或Y)计数.对于给定的矩阵A(例如250000 X 1000浮点矩阵),我正在做一个嵌套for循环,

    n = A.shape[1]
    for ix = arange(n)  
        for jx = arange(ix+1,n):
           matMI[ix,jx]= calc_MI(A[:,ix],A[:,jx])
Run Code Online (Sandbox Code Playgroud)

当然必须有更好/更快的方法来做到这一点?

顺便说一句,我也在数组上寻找列(列式或行式操作)的映射函数,但还没有找到一个很好的通用答案.

这是我的完整实现,遵循Wiki页面中的约定:

import numpy as np

def calc_MI(X,Y,bins):

   c_XY = np.histogram2d(X,Y,bins)[0]
   c_X = np.histogram(X,bins)[0]
   c_Y = np.histogram(Y,bins)[0]

   H_X = shan_entropy(c_X)
   H_Y = shan_entropy(c_Y)
   H_XY = shan_entropy(c_XY)

   MI = H_X + H_Y …
Run Code Online (Sandbox Code Playgroud)

python performance numpy scipy information-theory

45
推荐指数
1
解决办法
3万
查看次数

使用不同元素合并/连接数组

如何合并不同元素的混合(matlab风格)numpy

[array([ 0.]), 0.0, 0.0011627, 0.0, 2.69, 0.0, array([ 3.8269, 7.0184]), array([ 4.4e-16, 2.1e+00])]

(我尝试过np.concatenate,但显然它只需要数组作为输入).基本上,我想通过索引动态地连接矢量中的元素.我试过了:

 V = np.array([1,2,3,4,5,6])
 Y = np.array([7,8,9,10,11,12])

 Z = np.array([V[0:2],Y[0],V[3],Y[1:3],V[4:],Y[4:]])
Run Code Online (Sandbox Code Playgroud)

它工作,但内部有数组元素.我只想要一个平面的数字向量(Matlab风格),后来我用一堆这些向量做了一个矩阵(称为RES).即使是简单的

 np.savetxt('TT',RES,fmt='%1.1e') 
Run Code Online (Sandbox Code Playgroud)

失败,因为它期望浮动而不是内部的数组.

猜猜这应该很简单.np.hstack做的工作.但是有没有其他简单的方法来做Matlab样式索引和向量和标量的组合?

python matlab numpy vector

4
推荐指数
1
解决办法
3589
查看次数

使用numpy/pandas从两列创建联合命中数的矩阵

我有2个大型数据列(大约150万个值).它们的结构如下:

     col1 = [2,2,1,4,5,4,3,4,4,4,5,2,3,1,1 ..] etc.,
     col2 = [1,1,8,8,3,5,6,7,2,3,10.........] etc.,
Run Code Online (Sandbox Code Playgroud)

我想制作一个联合计数矩阵CountsMAT.col1的值范围为1到5,col2的范围为1到10.

     counts of [(1,2),(1,3),...(1,10),
                (2,1), (2,2),....(2,10),
                (3,1),......,(3,3)...(3,10),
                ...........................
                (5,1),(5,2),...(5,5).....(5,10)] are required ie.,

     a CountsMAT of size (5,10) 
     max(col1) = 5; max(col2) = 10 ;  
Run Code Online (Sandbox Code Playgroud)

我已经实现了一个带有defaultdict和for循环的版本,但这需要一段时间.我相信这可以直接用Pandas更好地处理,我很欣赏使用numpy/pandas的最佳实现.许多其他类似的查询指向Pandas的'groupby',但我并不精通它.

对于基于dict的实现,获取矩阵格式的输出也比较棘手.但是猜猜Pandas/numpy会更容易.谢谢!

python numpy distribution pandas

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