【问题标题】:Why does a cartesian product yield "TypeError: iteration over a 0-d array"?为什么笛卡尔积会产生“TypeError:0-d 数组上的迭代”?
【发布时间】:2019-05-31 00:13:55
【问题描述】:

我正在尝试从数组列表中制作笛卡尔积,但它一直给我一个 TypeError: iteration over a 0-d array

我有一个看起来像这样的列表:

print(a)
>>>[array([1., 2.]), array([3., 4.]), array(1400.)]

现在,当我尝试这样做时:

b=list(itertools.product(*a))
>>>TypeError: iteration over a 0-d array

我错过了什么?

【问题讨论】:

    标签: python itertools cartesian-product


    【解决方案1】:

    正如 @user2357112 在 cmets 中所解释的,您当前将最后一个元素作为 0 维数组。如果你检查它的长度,你会得到TypeError: len() of unsized object。为了使您的解决方案正常工作,您需要使用 [] 将元素包含在最后一个数组中,以便能够使用 product

    import itertools
    
    a = [np.array([1., 2.]), np.array([3., 4.]), np.array([1400.])]
    
    b = list(itertools.product(*a))
    
    #[(1.0, 3.0, 1400.0),
    # (1.0, 4.0, 1400.0),
    # (2.0, 3.0, 1400.0),
    # (2.0, 4.0, 1400.0)]
    

    编辑应要求回答第二个问题:

    import itertools
    
    dict1 = {'wdth_i': ['1', '2'], 'wdth_p': ['3', '4'], 'mu': '1400'}
    
    a = [] 
    for i in dict1.values():
        if isinstance(i, list):
            a.append(i)  
        else:
            a.append([i])
    
    f = list(itertools.product(*a))
    # [('1', '3', '1400'),
    #  ('1', '4', '1400'),
    #  ('2', '3', '1400'),
    #  ('2', '4', '1400')]
    

    【讨论】:

    • 最后一个数组不是长度为0的元组,是0维数组。它只有一个元素,没有长度(与长度为 0 不同),它不是元组。
    • @user2357112:好的,我编辑了我的措辞。如果您投了反对票,请恢复它或提出进一步的改进,以使答案更清晰。感谢您的评论
    • product 不是一个模块,* 解包不是问题所在,但最大的问题已经解决。
    • 现在我在产品上发生的拆包还有另一个问题:我有一个类似于dict1={{'wdth_i': ['1', '2'], 'wdth_p': ['3', '4'], 'mu': '1400'} 的字典,所以当我这样做时,'a=[] a.append(i) for i in dict1.values() f=list(itertools.product(*a))' 它“爆炸” mu 的值,即 '1400' 成 '1' '4' '0' '0' 并给我一个笛卡尔积:'[('1', '3', '1'), ('1', '3', '4'), ('1', '3', '0'), ( '1', '3', '0'), ('2', '3', '1'), ('2', '3', '4'), ('2', '3', '0'), ('2', '3', '0')]'。我错过了什么?
    猜你喜欢
    • 2017-09-28
    • 2011-07-13
    • 2016-08-03
    • 2018-07-16
    • 2012-08-27
    • 1970-01-01
    • 2016-10-08
    • 2011-01-26
    • 1970-01-01
    相关资源
    最近更新 更多