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