Numpy:沿轴应用返回错误:使用序列设置数组元素

时间:2016-12-28 19:24:51

标签: python numpy

一个非常快速而简单的错误,我无法解决这个问题来挽救我的生命:

temp = np.array([[5,0,3,5,6,0],
                 [2,2,1,3,0,0],
                 [5,3,4,5,3,4]])

def myfunc(x):
    return x[np.nonzero(x)]

np.apply_along_axis(myfunc, axis=1, arr=temp)

预期输出是我的临时数组的每个ROW的非零数字:

[5,3,5,6],[2,2,1,3],[5,3,4,5,3,4]

但是,我收到错误:ValueError:设置一个带序列的数组元素。

如果我只是在没有apply_along_axis的情况下这样做,它就可以了:

# prints [5,3,5,6]
print temp[0][np.nonzero(temp[0])]

奇怪的是,如果我只是将一个np.mean()添加到myfunc返回上面的第一个代码块,它会按预期工作:

# This works as expected    
temp = np.array([[5,0,3,5,6,0],
                 [2,2,1,3,0,0],
                 [5,3,4,5,3,4]])

def myfunc(x):
        return np.mean(x[np.nonzero(x)])

np.apply_along_axis(myfunc, axis=1, arr=temp)

我怀疑它与apply_along_axis如何在幕后工作有关。任何提示将不胜感激!

2 个答案:

答案 0 :(得分:2)

如文档中所述 -

  

返回:apply_along_axis:ndarray输出数组。形状   outarr与arr的形状相同,除了沿轴线   尺寸,其中outarr的长度等于的大小   返回func1d的值。如果func1d返回标量outarr将有   比arr少一个维度。

由于不同迭代时输出的形状不一致,我们似乎得到了这个错误。

现在,为了解决您的问题,让我建议在整个阵列上使用np.nonzero的方法,然后从中分割第二个输出 -

In [165]: temp = np.array([[5,0,3,5,6,0],
     ...:                  [2,2,1,3,0,0],
     ...:                  [5,3,4,5,3,4]])

In [166]: r,c = np.nonzero(temp)
     ...: idx = np.unique(r,return_index=1)[1]
     ...: out = np.split(c,idx[1:])
     ...: 

In [167]: out
Out[167]: [array([0, 2, 3, 4]), array([0, 1, 2, 3]), array([0, 1, 2, 3, 4, 5])]

答案 1 :(得分:1)

在numpy 1.13中,此定义应该有效:

def myfunc(x):
    res = np.empty((), dtype=object)
    res[()] = x[np.nonzero(x)]
    return res

通过返回包含该数组的0d数组,numpy将不会尝试并堆叠子数组。