【问题标题】:Python: Hierarchical SlicingPython:分层切片
【发布时间】:2023-04-04 03:45:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • sum(np.apply_along_axis(someFunc,1,A)) 虽然不是矢量化选项?
  • someFunc 应该做什么?
  • 在这种情况下,它是在计算每行相等值的数量……但是我在很多情况下都遇到过这个问题,所以我提出了一个更笼统的问题。

标签: python numpy slice syntactic-sugar


【解决方案1】:

如果我理解正确,您可以使用这样的列表推导:

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

【讨论】:

    【解决方案2】:

    定义一个函数来计算数组中的 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 行)来解决。

    【讨论】:

      猜你喜欢
      • 2021-11-26
      • 1970-01-01
      • 2019-10-04
      • 2014-08-13
      • 1970-01-01
      • 2021-04-28
      • 2015-09-07
      • 2016-12-26
      • 2017-08-19
      相关资源
      最近更新 更多