假设我有一个数组 (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 数组 B
,B.argmax(axis=0)
给出每列中第一个 True 值的索引。要获取 last True 值的索引,请反转数组,获取 argmax,然后将结果从行数减 1 中减去;即 B.shape[0]-1 - B[::-1].argmax(axis=0)
。在本例中,B
是 np.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/