Python:分层切片

Python: Hierarchical Slicing

是否有更多 pythonic/numpythonic 方法来进行某种 nested/hierarchical 切片,即更漂亮的版本:

_sum = 0
for i in np.arange(n):
   _sum += someFunc(A[i,:])

基本上我想在行上映射 someFunc(它采用任何形状的数组和 returns 一个数字),然后对结果求和。

我一直在考虑 np.sum(someFunc(A[:,:])),但根据我的理解,这只会映射 someFunc 整个数组。

如果我没理解错的话,你可以使用这样的列表理解:

sum([someFunc(A[i:]) for i in np.arange(n)]) 

定义一个函数来计算数组中的 1:

def foo(x):
    return (x==1).sum()

和一个二维数组:

In [431]: X=np.array([[1,0,2],[3,1,1],[0,2,3]])

我可以将它迭代地应用于行

In [432]: [foo(i) for i in X]   # iterate on 1st dimension
Out[432]: [1, 2, 0]
In [433]: [foo(X[i,:]) for i in range(3)]
Out[433]: [1, 2, 0]

并用 sum 得到总计数(这里是 Python 总和)

In [434]: sum([foo(X[i,:]) for i in range(3)])
Out[434]: 3

如所写foo 得到与应用于整个数组相同的东西

In [435]: foo(X)
Out[435]: 3

对于行数,使用np.sum轴控制:

In [440]: np.sum(X==1, axis=1)
Out[440]: array([1, 2, 0])

apply_along_axis可以对同一排序行迭代:

In [438]: np.apply_along_axis(foo,1,X)
Out[438]: array([1, 2, 0])

但是对于这个来说它是矫枉过正的。它对于 3d 或更大的数组更有用,在这些数组中迭代除 nth 之外的所有维度是很尴尬的。它永远不会比自己进行迭代更快。

如果您能编写适用于整个数组的函数,那显然是最好的。但是,如果您必须对行进行迭代,则没有任何神奇的解决方案。 vectorizefrompyfunc 包装使用标量值而不是一维数组的函数。一些 row 问题通过将行转换为更大的 dtype 对象(例如 unique 行)来解决。