Python Numpy数组:从带有NAN的数组中提取优先顺序值而不填充?
假设我有一个数组(M,N),其中每个“列”中的值N表示N台不同机器的数据记录。让我们也想象一下,每一行M代表一个唯一的“时间戳”,其中记录了所有N台机器的数据 数组(M,N)的结构使得在M=0时,这将对应于第一个“时间戳”(t0),并且行M=M(tm)表示最近的“时间戳”记录 让我们将这个数组称为“AX”。AX[0]将在第一个“时间戳”生成N台机器的记录数据。AX[-1]将是最近的记录 这是我的阵列:Python Numpy数组:从带有NAN的数组中提取优先顺序值而不填充?,python,arrays,numpy,nan,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.
>>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]])
现在,假设出现了一些问题,并且没有在每个“时间戳”为每台机器捕获一致的数据。为了创建一个输出的示例,我按照下面链接的示例在数组中的随机位置插入NAN:
假设我需要提供记录数据的最新值。理想情况下,这与引用AX[-1]一样简单。在这种特殊情况下,我几乎没有任何数据,因为一切都搞砸了
>>AX[-1]
array([-0.07626913, nan, nan, nan, nan])
目标:
我意识到任何数据都比没有好,因此我想使用为每台机器记录的最新的值。在这种特定情况下,我最好提供一个包含以下值的数组:
[-0.07626913, -0.9450442, 0.7364234, 0.83810714]
注意AX的第2列没有可用的数据,所以我跳过了它的输出
我觉得np.array不是很直观,当我阅读文档时,我被大量的专门函数和转换所淹没
我最初的想法可能是将所有的NaN过滤到一个新数组(AY),然后取最后一行AY[-1](假设这将保留其重要的基于行的顺序),然后我意识到这将生成一个形状奇怪的数组(为了方便起见,我在这里使用整数值,而不是AX的值):
假设这甚至可以创建,那么获取最后一行(?)将产生[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)
是一个布尔数组,如果AX
不是nan(也不是无限大,但我假设大小写不相关),则为True。对于布尔数组B
,B.argmax(axis=0)
给出每列中第一个真值的索引。要获得最后一个真值的索引,请反转数组,取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])
last\u vals
是每列中最后一个非nan值的一维数组,除非列都是nan,在这种情况下,last\u vals
中的值也是nan:
In [102]: last_vals
Out[102]: array([-0.07626913, -0.9450442 , nan, 0.7364234 , 0.83810714])
要消除last\u vals
中的非nan值,可以使用np.isfinite(last\u vals)
对其进行索引:
这看起来真的很有创意!我会慢慢地手动完成你的步骤,以确保我理解每个部分。这里有很多事情:)我感谢你的“接受”,但这可能太早了。有相当多聪明的裸体运动论者关注stackoverflow问题,如果你在接受一个问题之前等待一段时间,你就更有可能得到各种各样的答案。唉,我对这个网站很陌生,没有意识到这是获得答案的动机。人们继续上网吗对公认答案的质疑?是的,他们会。接受它没有什么错,但如果已经有公认的答案,有些人可能不会太仔细地看问题。等待一天左右可能是个好主意。在这种情况下,我觉得可以做些什么使这更简单或更有效,所以我不会错过我自己也看到了更多的答案。然而,你确实首先给出了一个有效的解决方案,这正是我所希望的。也许这个问题的性质会吸引天体物理学家们用他们的解决方案来迷惑我们,而不管问题的状态如何?或者我应该撤销接受(如果可能的话)并获得更多?无论如何,再次感谢。
In [100]: k = AX.shape[0] - 1 - np.isfinite(AX)[::-1].argmax(axis=0)
In [101]: last_vals = AX[k, np.arange(AX.shape[1])]
In [102]: last_vals
Out[102]: array([-0.07626913, -0.9450442 , nan, 0.7364234 , 0.83810714])
In [103]: last_vals[np.isfinite(last_vals)]
Out[103]: array([-0.07626913, -0.9450442 , 0.7364234 , 0.83810714])