gpt4 book ai didi

Python:从不同大小和 dtype 的单独列表创建 N 维列表

转载 作者:太空宇宙 更新时间:2023-11-04 05:02:49 25 4
gpt4 key购买 nike

假设我有这些列表:

a = [1, 2, 3, 4]
b = [6,7]
c = ['a', 'b', 'c']

我想创建一个 3 维数据结构,其中包含以所有可能的方式将每个列表的所有元素组合在一起的新列表。然后我想使用类似索引的矩阵来访问这些新列表。

例如,假设 f 是一个执行我想要的操作的函数。然后我可以这样做:

m = f(a,b,c)

然后 m[0][0][0] 会给出 [1,6,'a'],m[1][0][0] 会给出 [2,6,'a'],依此类推在。

基本上,我知道我已经可以使用嵌套的 for 循环来做到这一点。

jList = []
for j in a:
kList = []
for k in b:
lList = []
for l in c:
o = [j,k,l]
lList.append(o)
kList.append(lList)
jList.append(kList)

这给了我一个列表列表的列表。

[[[[1, 6, 'a'], [1, 6, 'b'], [1, 6, 'c']], 
[[1, 7, 'a'], [1, 7, 'b'], [1, 7, 'c']]],
[[[2, 6, 'a'], [2, 6, 'b'], [2, 6, 'c']],
[[2, 7, 'a'], [2, 7, 'b'], [2, 7, 'c']]],
[[[3, 6, 'a'], [3, 6, 'b'], [3, 6, 'c']],
[[3, 7, 'a'], [3, 7, 'b'], [3, 7, 'c']]],
[[[4, 6, 'a'], [4, 6, 'b'], [4, 6, 'c']],
[[4, 7, 'a'], [4, 7, 'b'], [4, 7, 'c']]]]

这很好,但我必须对大于 3 的维度执行此操作,而且许多嵌套的 for 循环似乎不可能是构建此类数据结构的最佳或最有效的方法。我忍不住想一定有更好的解决方案,一些库中的东西,比如我上面编写的函数,也许是 numpy 函数,但我已经做了很多搜索,但没有找到适合不同大小和像我一样的数据类型。

有什么想法吗?

最佳答案

您可以使用 itertools.product取列表的笛卡尔积,然后使用 numpy.reshape对于 reshape ,从列表的数量中获取最后一个维度,然后到最内层列表的长度,直到最外层列表的长度:

>>> args = a,b,c
>>> np.array(list(product(*args))).reshape(len(a), len(b), len(c), len(args))
array([[[['1', '6', 'a'],
['1', '6', 'b'],
['1', '6', 'c']],

[['1', '7', 'a'],
['1', '7', 'b'],
['1', '7', 'c']]],


[[['2', '6', 'a'],
['2', '6', 'b'],
['2', '6', 'c']],

[['2', '7', 'a'],
['2', '7', 'b'],
['2', '7', 'c']]],


[[['3', '6', 'a'],
['3', '6', 'b'],
['3', '6', 'c']],

[['3', '7', 'a'],
['3', '7', 'b'],
['3', '7', 'c']]],


[[['4', '6', 'a'],
['4', '6', 'b'],
['4', '6', 'c']],

[['4', '7', 'a'],
['4', '7', 'b'],
['4', '7', 'c']]]],
dtype='<U21')

您可以使用以下方法即时生成形状:tuple(map(len, args)) + (len(args),)(由@StevenRumbalski 建议),这样您现在就有了:

>>> np.array(list(product(*args))).reshape(tuple(map(len, args)) + (len(args),))

或者:

>>> np.array(list(product(*args))).reshape(tuple(map(len, args)) + (-1,))

无需指定最后一个维度。

关于Python:从不同大小和 dtype 的单独列表创建 N 维列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45311389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com