Python:分层切片

Python:分层切片,python,numpy,slice,syntactic-sugar,Python,Numpy,Slice,Syntactic Sugar,是否有一种更具pythonic/numpythonic风格的方式来进行某种嵌套/分层切片,即更漂亮的版本: _sum = 0 for i in np.arange(n): _sum += someFunc(A[i,:]) 基本上,我希望将someFunc(它采用任何形状的数组并返回一个数字)映射到行上,然后对结果求和 我一直在考虑np.sum(someFunc(A[:,:]),但根据我的理解,这将映射整个数组。如果我理解正确,您可以使用如下列表理解: sum([someFunc(A[i:

是否有一种更具pythonic/numpythonic风格的方式来进行某种嵌套/分层切片,即更漂亮的版本:

_sum = 0
for i in np.arange(n):
   _sum += someFunc(A[i,:])
基本上,我希望将
someFunc
(它采用任何形状的数组并返回一个数字)映射到行上,然后对结果求和


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

如果我理解正确,您可以使用如下列表理解:

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总和)

正如所写的
foo
获得了应用于整个数组的相同内容

In [435]: foo(X)
Out[435]: 3
对于行计数,使用
np.sum
轴控制:

In [440]: np.sum(X==1, axis=1)
Out[440]: array([1, 2, 0])
沿_轴应用_
可以应用于相同类型的行迭代:

In [438]: np.apply_along_axis(foo,1,X)
Out[438]: array([1, 2, 0])
但对于这一点来说,这是矫枉过正。对于3d或更大的数组,它更有用,因为除了第n个
one个
one个维度之外,在所有维度上迭代都很困难。它永远不会比你自己的迭代更快


显然,如果您可以编写函数来处理整个数组,那么这是最好的。但是,如果您必须对行进行迭代,则没有任何神奇的解决方案<代码>矢量化
frompyfunc
包装使用标量值而不是1d数组的函数。一些
问题可以通过将行强制转换为更大的数据类型对象(例如
唯一的
行)来解决。

求和(np.沿_轴应用_(someFunc,1,A))
虽然不是矢量化选项?在这种情况下,
someFunc
应该做什么,这是计算每行的相等值的数量…但是我在很多情况下遇到过这个问题,所以我提出了一个更一般的问题。
In [438]: np.apply_along_axis(foo,1,X)
Out[438]: array([1, 2, 0])