【问题标题】:Getting indices from numpy array and applying to 2nd lower dimensional array to create new array从 numpy 数组获取索引并应用于第二个低维数组以创建新数组
【发布时间】:2013-08-01 06:59:38
【问题描述】:

我有一个数组GammaGamma.shape=(20,7,90,144),它代表维度 (t,z,y,x) 以及我用[l,k,j,i] 表示的相应索引。对于每个 (t,y,x),我想找到 k 的最小值,使得 Gamma[l,k,j,i] > g_crit,其中 g_crit 是某个常数。将这组最低的k 值表示为k_low;我发现我可以用

很好地做到这一点
k_low = np.argmax(Gamma > g_crit, axis=1)

还有另一个数组levslevs.shape=(7,),也对应于z维度。我最终试图创建数组levs_low,例如levs_low.shape=(20,90,144)levs_low[l,j,i]=levs[k_low[l,j,i]]。我被困在这一步。请问有什么想法吗?谢谢。

【问题讨论】:

    标签: python numpy multidimensional-array


    【解决方案1】:

    对于您的情况,np.take() 似乎是一个不错的选择:

    levs_low = np.take( levs, k_low )
    

    OBS:take 似乎提供了优化的性能,check this question

    【讨论】:

      【解决方案2】:

      这应该可以解决问题:

      levs_low=levs[k_low]
      
      >>> Gamma=np.random.rand(20,7,90,144)
      >>> k_low = np.argmax(Gamma > .3, axis=1)
      >>> levs=np.random.rand(7)
      >>> levs_low=levs[k_low]
      >>> levs_low.shape
      (20, 90, 144)
      

      举个小例子:

      >>> g=np.random.randint(0,5,(4,4))
      >>> g
      array([[2, 0, 2, 2],
             [2, 0, 1, 0],
             [3, 3, 0, 3],
             [3, 0, 4, 4]])
      >>> k=np.arange(5)*-1
      >>> k
      array([ 0, -1, -2, -3, -4])
      >>> k[g]   #Uses indices of g to select values from k. Also same as np.take(k,g)
      array([[-2,  0, -2, -2],
             [-2,  0, -1,  0],
             [-3, -3,  0, -3],
             [-3,  0, -4, -4]])
      

      @Saullo Castro 的回答很有趣。奇怪的是,花式索引和np.take 之间的时间差异约为 5 倍。

      %timeit levs[k_low]
      100 loops, best of 3: 2.3 ms per loop
      
      %timeit np.take( levs, k_low )
      1000 loops, best of 3: 439 us per loop
      
      In [33]: np.all(levs[k_low]==np.take(levs,k_low))
      Out[33]: True
      

      【讨论】:

      • 非常优雅!我应该知道 Python 会让它变得如此简单。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 2023-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多