我试图在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
如果有必要,我可以修改函数获取它的参数的方式.
我有一个实用程序函数,用于在我有两个或更多个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版本.
鉴于以下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)