一个非常快速而简单的错误,我无法解决这个问题来挽救我的生命:
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如何在幕后工作有关。任何提示将不胜感激!
答案 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将不会尝试并堆叠子数组。