鉴于偶数n,我想提出一个3^(n/2)-1由n2D-numpy的阵列.每一行的前半部分应迭代所有可能的-1,0,1值,后半部分应为零.但是,上半场永远不应该全是零.
这个代码几乎可以工作,除了它包括我不想要的所有零行.
n = 4
M = [list(row) +[0]*(n/2) for row in itertools.product([-1,0,1], repeat = n/2)]
print np.array(M)
Run Code Online (Sandbox Code Playgroud)
它给
[[-1 -1 0 0]
[-1 0 0 0]
[-1 1 0 0]
[ 0 -1 0 0]
[ 0 0 0 0]
[ 0 1 0 0]
[ 1 -1 0 0]
[ 1 0 0 0]
[ 1 1 0 0]]
Run Code Online (Sandbox Code Playgroud)
是否有一个不那么可怕,更有时间和空间效率的方法来做到这一点? n最终将是30,我当然不打印出来.3 ^ 15只有14,348,907但是当我设置n=30和使用很长时间时,代码使用我的8GB机器上的所有RAM .
如何在不通过itertools,列表等的情况下直接制作numpy数组?
我试图在受边界条件约束的投资组合中生成所有可能的金融工具组合。
例如,假设我有一组列表,这些列表代表对投资组合的分配,受每种工具的总投资组合规模的最小和最大百分比影响:
"US Bonds" = {0.10,0.15,0.20,0.25,0.30}
"US Equities" = {0.25, 0.30, 0.35, 0.40, 0.45, 0.50}
"European Bonds" = {0.10, 0.15, 0.20}
"European Equities = {0.20,0.25,0.30,0.35,0.40,0.45,0.50}
...
"Cash" = {0.0, 0.05, 0.10, 0.15,...0.95}
Run Code Online (Sandbox Code Playgroud)
我的资产清单如下所示:
[In]
Asset
[Out]
[[0.1, 0.15, 0.2, 0.25, 0.30],
[0.25, 0.30,0.35, 0.40, 0.45, 0.50],
[0.1, 0.15, 0.2],
[0.20, 0.25, 0.30,0.35, 0.40, 0.45, 0.50]
...
[0.0, 0.05, 0.1, 0.15, 0.2, 0.25,...0.95]]
Run Code Online (Sandbox Code Playgroud)
在每种工具组合之和必须 = 1 的条件下,生成所有可能的投资组合的最有效方法是什么?
现在,我正在创建一个“投资组合”列表,如下所示:
portfolios = [item for item in itertools.product(*asset) if np.isclose(sum(item),1)]
Run Code Online (Sandbox Code Playgroud)
(注意,'np.isclose' 负责处理时髦的 fp 算术)。 …
首先,我能够做到,但我对速度不满意。
我的问题是,有没有更好、更快的方法来做到这一点?
我有一个如下所示的项目列表:
[(1,2), (1,2), (4,3), (7,8)]
Run Code Online (Sandbox Code Playgroud)
我需要获得所有独特的组合。例如,两个项目的独特组合将是:
[(1,2), (1,2)], [(1,2), (4,3)], [(1,2), (7,8)], [(4,3), (7,8)]
Run Code Online (Sandbox Code Playgroud)
使用 itertools.combinations 后,由于重复,我得到的比这多得多。例如,我得到包含 (1,2) 的每个列表两次。如果我创建一组这些组合,我会得到独特的组合。当原始列表有 80 个元组并且我想要其中包含 6 个项目的组合时,问题就出现了。完成该设置需要 30 秒以上。如果我能把这个数字降下来,我会很高兴。
我知道组合的数量很大,这就是为什么创建该组合非常耗时。但我仍然希望有一个库能够以某种方式优化该过程,从而加快速度。
值得注意的是,在我发现的所有组合中,我只测试了前 10000 个左右。因为在某些情况下,所有组合都可能需要处理太多,所以我不想在它们上花费太多时间,因为还有其他测试要做。
这是我现在拥有的示例:
from itertools import combinations
ls = [list of random NON-unique sets (x,y)]
# ls = [(1,2), (1,2), (4,3), (7,8)] # example
# in the second code snipped it is shown how I generate ls for testing
all_combos = combinations(ls, 6)
all_combos_set = set(all_combos)
for combo in all_combos_set:
do_some_test_on(combo) …Run Code Online (Sandbox Code Playgroud) 我在两个独立的数组中有纬度和经度坐标:
a = np.array([71,75])
b = np.array([43,42])
Run Code Online (Sandbox Code Playgroud)
如何轻松找到由这些坐标组成的所有可能点?
我一直在搞乱itertools.combinations:
In [43]:
list(itertools.combinations(np.concatenate([a,b]), r=2))
Out[43]:
[(71, 75), (71, 43), (71, 42), (75, 43), (75, 42), (43, 42)]
Run Code Online (Sandbox Code Playgroud)
但是这并不适合我,因为点工作(71,75)和(43,42)为纬度/经度和纬度/经度对.
我想拥有的是:
Out[43]:
[(71, 43), (71, 42), (75, 43), (75, 42)]
Run Code Online (Sandbox Code Playgroud)
a和b阵列最终将具有更大的尺寸,但将保持与纬度/经度对相同的尺寸.
假设我有以下系列:
0 A
1 B
2 C
dtype: object
0 1
1 2
2 3
3 4
dtype: int64
Run Code Online (Sandbox Code Playgroud)
如何合并它们以创建包含每个可能的值组合的空数据框,如下所示:
letter number
0 A 1
1 A 2
2 A 3
3 A 4
4 B 1
5 B 2
6 B 3
7 B 4
8 C 1
9 C 2
10 C 3
11 C 4
Run Code Online (Sandbox Code Playgroud) 我有一个n维数组,如下所示:
np.array([[0,3],[0,3],[0,10]])
Run Code Online (Sandbox Code Playgroud)
在此数组中,元素表示低值和高值.例如:[0,3]指[0,1,2,3]
我需要使用上面给出的范围生成所有值的组合.例如,我想要[0,0,0], [0,0,1] ... [0,1,0] ... [3,3,10]
我尝试过以下方法来获得我想要的东西:
ds = np.array([[0,3],[0,3],[0,10]])
nItems = int(reduce(lambda a,b: a * (b[1] - b[0] + 1), ds, 1))
myCombinations = np.zeros((nItems,))
nArrays = []
for x in range(ds.shape[0]):
low = ds[x][0]
high= ds[x][1]
nitm = high - low + 1
ar = [x+low for x in range(nitm) ]
nArrays.append(ar)
myCombinations = cartesian(nArrays)
Run Code Online (Sandbox Code Playgroud)
笛卡尔函数取自于使用numpy来构建两个数组的所有组合的数组
我需要做几百万次.
我的问题:有没有更好/更有效的方法来做到这一点?
我想创建一个包含所有可能(x,y)值的列表.
例如 - 对于输入(x = 2,y = 3),输出应为:
np.array([
[0,0],
[0,1],
[0,2],
[1,0],
[1,1],
[1,2]])
Run Code Online (Sandbox Code Playgroud)
订单并不重要