【问题标题】:too many indices for array when using np.where使用 np.where 时数组的索引过多
【发布时间】:2017-10-13 18:18:09
【问题描述】:

我有代码:

a=b=np.arange(9).reshape(3,3)
c=np.zeros(3)

for x in range(3):
    c[x]=np.average(b[np.where(a<x+3)])

c 的输出是

&gt;&gt;&gt;array([ 1. , 1.5, 2. ])

我想使用数组(向量化)而不是 for 循环,然后我做了以下代码:

a=b=np.arange(9).reshape(3,3)
c=np.zeros(3)
i=np.arange(3)
c[i]=np.average(b[np.where(a<i[:,None,None]+3)])

但它显示 IndexError: too many indices for array

至于a&lt;i[:,None,None]+3

正确显示

array([[[ True,  True,  True],
        [False, False, False],
        [False, False, False]],

       [[ True,  True,  True],
        [ True, False, False],
        [False, False, False]],

       [[ True,  True,  True],
        [ True,  True, False],
        [False, False, False]]], dtype=bool)

但是当我使用b[np.where(a&lt;i[:,None,None]+3)] 时,它再次显示 IndexError: too many indices for array。我无法得到c 的正确输出。

【问题讨论】:

    标签: python numpy indices


    【解决方案1】:

    我感觉到您正在尝试将这里的东西矢量化,尽管没有明确提及。现在,我认为您不能以矢量化方式进行索引。为了以矢量化的方式解决您的问题,我建议使用np.tensordot 并在broadcasting 的帮助下使用matrix-multiplication 进行减和,正如您在试验中已经提出的那样。

    因此,一种解决方案是 -

    from __future__ import division
    
    i = np.arange(3)
    mask = a<i[:,None,None]+3
    c = np.tensordot(b,mask,axes=((0,1),(1,2)))/mask.sum((1,2))
    

    Related post to understand tensordot.

    可能的性能改进

    • 在输入 np.dot 之前将掩码转换为 float dtype,因为使用它基于 BLAS 的矩阵乘法会更快。

    • 使用np.count_nonzero 而不是np.sum 来计算布尔值。所以,用它来替换mask.sum() 部分。

    【讨论】:

    • 求和或平均只是一个例子,实际上我只是想得到' b[np.where(a
    • @kinderchan 如果我理解正确,您可以使用:np.broadcast_to(b, mask.shape)[mask]?
    • 我试过了,不行,我也用b[mask,i[:,None]],也失败了。
    • @kinderchan 您需要更好地解释您的“不起作用”部分。我建议编辑您的问题,并告诉我们您希望得到什么,例如:b[np.where(a&lt;i[:,None,None]+3)]
    • 我重新编辑了问题,问题是np.where(a&lt;i[:,None,None]+3)给出了3d数组,但b是2d。
    猜你喜欢
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 2021-01-19
    • 2020-04-29
    • 1970-01-01
    相关资源
    最近更新 更多