【问题标题】:Get last x non-nan elements from numpy array从 numpy 数组中获取最后 x 个非 nan 元素
【发布时间】:2021-05-15 11:03:13
【问题描述】:

我有一个 2D numpy 数组,其中散布着随机的 nan 值。我现在的目标是仅从该数组中获取沿维度 0 的最后一个 x 非 nan 元素。

import numpy as np
np.random.seed(0)
M, N, c = 10, 5, 15
A = np.random.randn(M,N)
A.ravel()[np.random.choice(A.size, c, replace=False)] = np.nan

A
[[ 1.76405235         nan  0.97873798  2.2408932          nan]
 [-0.97727788         nan         nan         nan  0.4105985 ]
 [ 0.14404357  1.45427351         nan  0.12167502  0.44386323]
 [ 0.33367433         nan -0.20515826  0.3130677  -0.85409574]
 [        nan  0.6536186   0.8644362  -0.74216502  2.26975462]
 [        nan  0.04575852         nan  1.53277921  1.46935877]
 [ 0.15494743  0.37816252 -0.88778575         nan -0.34791215]
 [ 0.15634897  1.23029068  1.20237985 -0.38732682         nan]
 [        nan -1.42001794 -1.70627019         nan -0.50965218]
 [-0.4380743  -1.25279536  0.77749036         nan -0.21274028]]

所以在这个例子中,对于 x=3 最后我想要一个大小为 3x5 的数组,只包含最后 3 个非 nan 值。像这样:

[[ 0.15494743  1.23029068  1.20237985 -0.74216502 -0.34791215]
 [ 0.15634897 -1.42001794 -1.70627019  1.53277921 -0.50965218]
 [-0.4380743  -1.25279536  0.77749036 -0.38732682 -0.21274028]]

我知道我可以使用 idx = np.where(~np.isnan(A)) 来获取非 nan 值的索引,但我不确定如何从那里继续。

编辑:这可以使用for 循环轻松完成,但我理想情况下正在寻找矢量化解决方案。

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    所以我想出了一种方法来做到这一点。我不知道它是否是最快的,但它是矢量化的,所以它不应该太慢。如果有人有可能更快的解决方案,我肯定很感兴趣。

    def last_x_non_nan(a, x):
        # end points
        non_count = np.cumsum(np.count_nonzero(~np.isnan(a), axis=0))
        rel_idx = np.arange(-x, 0)
        abs_idx = (rel_idx[:,None] + non_count).ravel('F')
    
        # non-nan array ordered in column-major
        arr_raveled = a.ravel('F')
        arr_clear = arr_raveled[~np.isnan(arr_raveled)]
    
        # Subset and convert to desired shape
        return arr_clear[abs_idx].reshape((x, a.shape[1]), order='F')
    

    这将返回预期的输出:

    print(last_x_non_nan(A, 3))
    [[ 0.15494743  1.23029068  1.20237985 -0.74216502 -0.34791215]
     [ 0.15634897 -1.42001794 -1.70627019  1.53277921 -0.50965218]
     [-0.4380743  -1.25279536  0.77749036 -0.38732682 -0.21274028]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 2013-06-24
      • 2020-03-11
      • 2020-07-03
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      相关资源
      最近更新 更多