python - Numpy 数组 : Extracting preferentially ordered values from array with Nans without padding?

标签 python arrays numpy nan

假设我有一个数组 (M,N),其中每个“列”中的值 N 代表 N 个不同机器的数据记录。我们还假设每个“行”M 代表一个唯一的“时间戳”,其中记录了所有 N 台机器的数据。

数组 (M,N) 的结构方式使得在 M = 0 时,这将对应于第一个“时间戳”(t0),并且行 M = M (tm) 表示最近的时间戳“时间戳”记录。

我们称这个数组为“AX”。 AX[0] 将在第一个“时间戳”处生成 N 台机器的记录数据。 AX[-1] 将是最新的记录。

这是我的数组:

>>AX = np.random.randn(3, 5)

array([[ 0.53826804, -0.9450442 , -0.10279278,  0.47251871,  0.32050493],
       [-0.97573464, -0.42359652, -0.00223274,  0.7364234 ,  0.83810714],
       [-0.07626913,  0.85246932, -0.13736392, -1.39977431, -1.39882156]])

现在想象一下出了问题,并且每台机器在每个“时间戳”上都没有一致地捕获数据。为了创建一个输出示例,我按照下面链接的示例将 Nans 插入到数组中的随机位置:

Create sample numpy array with randomly placed NaNs

>>AX.ravel()[np.random.choice(AX.size, 9, replace=False)] = np.nan


array([[ 0.53826804, -0.9450442 ,         nan,  0.47251871,         nan],
       [        nan,         nan,         nan,  0.7364234 ,  0.83810714],
       [-0.07626913,         nan,         nan,         nan,         nan]])

假设我需要提供记录数据的最新值。理想情况下,这就像引用 AX[-1] 一样简单。在这种特殊情况下,我几乎没有任何数据,因为一切都搞砸了。

>>AX[-1]

array([-0.07626913,         nan,         nan,         nan,         nan])

目标:

我意识到任何数据都比没有好,所以我想使用为每台机器记录的最新值。在这种特殊情况下,我能做的最好的就是提供一个包含值的数组:

[-0.07626913, -0.9450442, 0.7364234, 0.83810714]

注意 AX 的第 2 列没有可用数据,因此我跳过了它的输出。

我认为 np.arrays 不是很直观,当我通读文档时,我对大量的专用函数和转换感到不知所措。

我最初的想法是也许将所有 Nans 过滤到一个新数组 (AY),然后取最后一行 AY[-1] (假设这将保留其重要的基于行的排序)然后我意识到这将创建一个具有奇怪形状的数组(为了方便起见,我只是在此处使用整数值而不是 AX 的值):

[1,2,3],
[4,5],
[6]

假设甚至可以创建,取最后一个“行”(?)将产生 [6,5,3] 并且会完全搞乱一切。用值填充数组也很糟糕,因为最新的值将填充最近“时间戳”行中 5 个数据点中的 4 个。

有没有一种方法可以以相当轻松的方式实现我想要的,同时仍然使用 np.array 结构并避免数据帧和面板?

谢谢!

最佳答案

这种问题可以产生许多有趣的答案。有人可能会想出比这更好的方法,但为了开始工作,有一种可能性:

In [99]: AX
Out[99]: 
array([[ 0.53826804, -0.9450442 ,         nan,  0.47251871,         nan],
       [        nan,         nan,         nan,  0.7364234 ,  0.83810714],
       [-0.07626913,         nan,         nan,         nan,         nan]])

np.isfinite(AX) 是一个 bool 数组,为 True,其中 AX 不是 nan(也不是无限的,但我认为情况不相关)。对于 bool 数组 BB.argmax(axis=0) 给出每列中第一个 True 值的索引。要获取 last True 值的索引,请反转数组,获取 argmax,然后将结果从行数减 1 中减去;即 B.shape[0]-1 - B[::-1].argmax(axis=0)。在本例中,Bnp.isfinite(AX),因此我们有:

In [100]: k = AX.shape[0] - 1 - np.isfinite(AX)[::-1].argmax(axis=0)

k 包含最终值出现的行索引。每列都有一个,因此相应的列索引就是 np.arange(AX.shape[1])

In [101]: last_vals = AX[k, np.arange(AX.shape[1])]

last_vals 是每列中最后一个非 nan 值的一维数组,除非列全部为 nan,在这种情况下,last_vals 中的值为还南:

In [102]: last_vals
Out[102]: array([-0.07626913, -0.9450442 ,         nan,  0.7364234 ,  0.83810714])

要消除 last_vals 中的非 nan 值,您可以使用 np.isfinite(last_vals) 对其进行索引:

In [103]: last_vals[np.isfinite(last_vals)]
Out[103]: array([-0.07626913, -0.9450442 ,  0.7364234 ,  0.83810714])

关于python - Numpy 数组 : Extracting preferentially ordered values from array with Nans without padding?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38318041/

相关文章:

python - 为什么我们需要 asyncio.coroutine 装饰器?

Python Regex - 检查后面是否有小写字母的大写字母

python - 理解 ‘backward()’ : How to code the Pytorch function ‘.backward()’ from scratch?

python - 如何使用关键字从 txt 文件中搜索和检索整行

python - 使用 Pandas 的 numpy 插值

python - 如何在 numpy 中获得逐元素矩阵乘法(Hadamard 乘积)?

python - 如何使用 ffmpeg (ffmpeg-python) 绘制带有颜色渐变填充的文本?然后与音乐混合?

javascript - 根据javascript中的匹配条件从数组数组中查找匹配项

python - 类型错误 : an integer is required in pd. 合并 python

python - 包含应用于数组的真值检查的函数返回错误