Python 乘出多维数组

Python 乘出多维数组,python,python-3.x,pandas,Python,Python 3.x,Pandas,我试图用变量输入乘以一个列表,例如 ipList=[[4,6,1],[5,6,1],[1,2,1],[14,15,1]] 请注意,元素1和3是1项,但元素2有2项(这是可变的,甚至可以有更多项) 此列表显示了值(开始、停止、步骤),因此这里有3个输入 (1) [4..6],(步骤1) (2) [5..6],[1..2],(步骤1,步骤1) (3) [14..15](步骤1) 我想要这些值的笛卡尔平面。 用每个可能的值保存(在本例中为3列)的数据帧 然而,在这种情况下,最终结果应该是 另一个

我试图用变量输入乘以一个列表,例如
ipList=[[4,6,1],[5,6,1],[1,2,1],[14,15,1]]
请注意,元素1和3是1项,但元素2有2项(这是可变的,甚至可以有更多项)

此列表显示了值(开始、停止、步骤),因此这里有3个输入
(1) [4..6],(步骤1)
(2) [5..6],[1..2],(步骤1,步骤1)
(3) [14..15](步骤1)
我想要这些值的笛卡尔平面。 用每个可能的值保存(在本例中为3列)的数据帧

然而,在这种情况下,最终结果应该是



另一个(更简单的例子)是:
```ipList=[[8,9,1],[1,2,1],[1,2,1]]``` 这里有两个元素:
(1) [8,9,1]-8,9(开始-8,停止-9,步骤-1)
(2) [1,1]、[1,2]、[2,1]、[2,2]、[2,2]的[1,2,1]、[1,2,1]]值

所以最终的结果是
8, [1,1]
8, [1,2]
8, [2,1]
8, [2,2]
9, [1,1]
9, [1,2]
9, [2,1]
9, [2,2]

这个想法是你有一个元素 [el1,el2,el3]但这些都有不同的大小

我试过很多方法,但我相信一定有更简单的方法 我见过许多构成笛卡尔平面的线,但只能用单个值, 我已经建立了一个显示每一行的框架,并考虑将其相乘。


任何帮助都将不胜感激。

编写定制的
生成器来迭代定制的格式在实践中是非常合理和常见的。如果没有人能找到魔法咒语,就试试这个吧

代码 可以使用
list(gen())
列出所有条目:

数据帧可以很容易地构造

df = pd.DataFrame(ans, columns=["col1", "col2", "col3"])  # column names are optional
但是,生成器最显著的优点是,您可以逐个迭代笛卡尔乘积项,而不生成整个列表。当笛卡尔积的大小很大时,这可以节省大量资源

for tup in gen(ipList):
    # do something with tup, e.g.
    # print(tup)
结果
您可以为end dataframe提供更多值以使其在模式上更清晰吗?用完整结果更新了问题我不确定我是否理解此处所需的输出,您可以发布您期望的输出吗非常感谢!
pd.merge(df1, df2,on='key')[['col1', 'col2', 'col3']]
Out[19]: 
   col1  col2    col3
0     1     3  [5, 1]
1     1     3  [5, 2]
2     2     4  [5, 1]
3     2     4  [5, 2]
import pandas as pd
import itertools

def gen(ipList):
    l1 = list(range(ipList[0][0], ipList[0][1] + 1, ipList[0][2]))
    l2 = list(range(ipList[1][0][0], ipList[1][0][1] + 1, ipList[1][0][2]))
    l3 = list(range(ipList[1][1][0], ipList[1][1][1] + 1, ipList[1][1][2]))
    l4 = list(range(ipList[2][0], ipList[2][1] + 1, ipList[2][2]))
    for tup in itertools.product(l1, l2, l3, l4):
        yield tup[0], [tup[1], tup[2]], tup[3]

ipList = [[4,6,1],[[5,6,1],[1,2,1]],[14,15,1]]
ans = list(gen(ipList))
df = pd.DataFrame(ans, columns=["col1", "col2", "col3"])  # column names are optional
for tup in gen(ipList):
    # do something with tup, e.g.
    # print(tup)
ans
Out[14]: 
[(4, [5, 1], 14),
 (4, [5, 1], 15),
 (4, [5, 2], 14),
 (4, [5, 2], 15),
 (4, [6, 1], 14),
 (4, [6, 1], 15),
 (4, [6, 2], 14),
 (4, [6, 2], 15),
 (5, [5, 1], 14),
 (5, [5, 1], 15),
 (5, [5, 2], 14),
 (5, [5, 2], 15),
 (5, [6, 1], 14),
 (5, [6, 1], 15),
 (5, [6, 2], 14),
 (5, [6, 2], 15),
 (6, [5, 1], 14),
 (6, [5, 1], 15),
 (6, [5, 2], 14),
 (6, [5, 2], 15),
 (6, [6, 1], 14),
 (6, [6, 1], 15),
 (6, [6, 2], 14),
 (6, [6, 2], 15)]

df
Out[15]: 
    col1    col2  col3
0      4  [5, 1]    14
1      4  [5, 1]    15
2      4  [5, 2]    14
3      4  [5, 2]    15
4      4  [6, 1]    14
5      4  [6, 1]    15
6      4  [6, 2]    14
7      4  [6, 2]    15
8      5  [5, 1]    14
9      5  [5, 1]    15
10     5  [5, 2]    14
11     5  [5, 2]    15
12     5  [6, 1]    14
13     5  [6, 1]    15
14     5  [6, 2]    14
15     5  [6, 2]    15
16     6  [5, 1]    14
17     6  [5, 1]    15
18     6  [5, 2]    14
19     6  [5, 2]    15
20     6  [6, 1]    14
21     6  [6, 1]    15
22     6  [6, 2]    14
23     6  [6, 2]    15