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
之外的所有维度是很尴尬的。它永远不会比自己进行迭代更快。
如果您能编写适用于整个数组的函数,那显然是最好的。但是,如果您必须对行进行迭代,则没有任何神奇的解决方案。 vectorize
和 frompyfunc
包装使用标量值而不是一维数组的函数。一些 row
问题通过将行转换为更大的 dtype 对象(例如 unique
行)来解决。
是否有更多 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
之外的所有维度是很尴尬的。它永远不会比自己进行迭代更快。
如果您能编写适用于整个数组的函数,那显然是最好的。但是,如果您必须对行进行迭代,则没有任何神奇的解决方案。 vectorize
和 frompyfunc
包装使用标量值而不是一维数组的函数。一些 row
问题通过将行转换为更大的 dtype 对象(例如 unique
行)来解决。