相关疑难解决方法(0)

使用numpy构建两个数组的所有组合的数组

我试图在6参数函数的参数空间上运行以研究它的数值行为,然后再尝试做任何复杂的事情,所以我正在寻找一种有效的方法来做到这一点.

给定6-dim numpy数组作为输入,我的函数采用浮点值.我最初尝试做的是:

首先,我创建了一个函数,它接受2个数组并生成一个数组,其中包含来自两个数组的所有值组合

from numpy import *
def comb(a,b):
    c = []
    for i in a:
        for j in b:
            c.append(r_[i,j])
    return c
Run Code Online (Sandbox Code Playgroud)

然后我习惯reduce()将它应用于相同数组的m个副本:

def combs(a,m):
    return reduce(comb,[a]*m)
Run Code Online (Sandbox Code Playgroud)

然后我评估我的功能如下:

values = combs(np.arange(0,1,0.1),6)
for val in values:
    print F(val)
Run Code Online (Sandbox Code Playgroud)

这有效,但它太慢了.我知道参数的空间很大,但这不应该太慢.在这个例子中我只抽取了10 6(一百万)个点,并且创建数组花了超过15秒values.

你知道用numpy做这个更有效的方法吗?

F如果有必要,我可以修改函数获取它的参数的方式.

python arrays numpy multidimensional-array

132
推荐指数
9
解决办法
10万
查看次数

从迭代产品中制作一个Pandas MultiIndex?

我有一个实用程序函数,用于在我有两个或更多个iterables时创建Pandas MultiIndex,并且我想为这些迭代中的值的每个唯一配对创建一个索引键.看起来像这样

import pandas as pd
import itertools

def product_index(values, names=None):
    """Make a MultiIndex from the combinatorial product of the values."""
    iterable = itertools.product(*values)
    idx = pd.MultiIndex.from_tuples(list(iterable), names=names)
    return idx
Run Code Online (Sandbox Code Playgroud)

并且可以像:

a = range(3)
b = list("ab")
product_index([a, b])
Run Code Online (Sandbox Code Playgroud)

创造

MultiIndex(levels=[[0, 1, 2], [u'a', u'b']],
           labels=[[0, 0, 1, 1, 2, 2], [0, 1, 0, 1, 0, 1]])
Run Code Online (Sandbox Code Playgroud)

这很好用,但它似乎是一个常见的用例,我很惊讶我必须自己实现它.所以,我的问题是,我在Pandas库中错过/误解了哪些提供此功能?

编辑补充:这个功能已经被添加到大熊猫作为MultiIndex.from_product为0.13.1版本.

python pandas

12
推荐指数
1
解决办法
3116
查看次数

从数据框到数据透视表时,Pandas处理缺失值

鉴于以下pandas数据框:

df = pd.DataFrame({'A': ['foo' ] * 3 + ['bar'],
         'B': ['w','x']*2,
         'C': ['y', 'z', 'a','a'],
         'D': rand.randn(4),
          })

print df.to_string()
"""
     A  B  C           D
0  foo  w  y  0.06075020
1  foo  x  z  0.21112476
2  foo  w  a  0.01652757
3  bar  x  a  0.17718772
"""
Run Code Online (Sandbox Code Playgroud)

注意没有bar,w组合.执行以下操作时:

pv0 = pandas.pivot_table(df, rows=['A','B'],cols=['C'], aggfunc=numpy.sum)

pv0.ix['bar','x'] #returns result

pv0.ix['bar','w'] #key error though i would like it to return all Nan's

pv0.index #returns 
[(bar, x), (foo, w), (foo, x)]
Run Code Online (Sandbox Code Playgroud)

只要在'C'列中至少有一个条目与foo,x的情况一样(它在'C'列中只有'z'的值),它将为其他列值返回NaN' C'不存在于foo,x(例如'a','y')

我想要的是拥有所有多索引组合,即使那些没有所有列值数据的组合.

pv0.index …
Run Code Online (Sandbox Code Playgroud)

python pivot-table pandas

10
推荐指数
1
解决办法
2260
查看次数