Python scipy中的简单计算:极小值

Python scipy中的简单计算:极小值,python,numpy,scipy,Python,Numpy,Scipy,我想计算最小值。 用星号表示的五个元素中的一个最小值,依此类推。因此,将有25个最小值,这将导致5*5数组大小。 我做了如下尝试: import numpy as np from scipy import signal data = np.array([[[*3, 2, 1, np.nan, np.nan], [22, 1, 1, 4, 4], [4, 2, 3, 3, 4], [1, 1, 4, 1, 5],

我想计算最小值。 用星号表示的五个元素中的一个最小值,依此类推。因此,将有25个最小值,这将导致5*5数组大小。 我做了如下尝试:

import numpy as np
from scipy import signal

data = np.array([[[*3, 2, 1, np.nan, np.nan],
              [22, 1, 1, 4, 4],
              [4, 2, 3, 3, 4],
              [1, 1, 4, 1, 5],
              [2, 4, 5, 2, 1]],

             [[*6, 7, 10, 6, np.nan],
              [np.nan, 7, 8, 6, 9],
              [6, 10, 9, 8, 10],
              [6, 8, 7, 10, 8],
              [10, 9, 9, 10, 8]],

             [[*6, 7, 10, np.nan, np.nan],
              [19, 19, 8, 6, 9],
              [6, 10, 9, 8, 10],
              [6, 8, 7, 10, 8],
              [10, 9, 9, 10, 8]],

             [[*6, 7, 10, 6, np.nan],
              [19, 21, 8, 6, 9],
              [6, 10, 9, 8, 10],
              [6, 8, 7, 10, 8],
              [10, 9, 9, 10, 8]],

             [[*12, 14, 12, 15, np.nan],
              [19, 11, 14, 14, 11],
              [13, 13, 16, 15, 11],
              [14, 15, 14, 16, 14],
              [13, 15, 11, 11, 14]]])
但是,下面的错误。有什么想法吗

data = data.reshape(5,25)
minima = data[signal.argrelmin(data,axis=0,order=1)]
print minima

注意:我的python现在正处于崩溃状态,所以我还不能测试它。如果我有什么不对劲,请告诉我

将数据重塑为(5,25)时,数据将沿轴0增加。这意味着每个argrelmin(数据,axis=0)没有相对最小值,除非指定mode='wrap'。在这种情况下,每个向量的第一个元素将是最小值。但是,如果向量中的所有元素都是NaN(在数据集中确实出现),或者如果最后一个元素是NaN,则不一定如此。由于argrelmin使用np.less进行比较(与NaNs的所有比较都返回False),因此我猜无论您如何修改函数调用,您都不会在这些行中找到最小值(尽管我没有尝试过)

总结:argrelmin返回空数组的原因是数据集的第一个轴上没有相对最小值。还请注意,除非您能够做出一些非常具体的假设(例如,数据正在增加、使用wrap和无NAN),否则不能保证数据集中有25个最小值

这也是为什么在沿轴1应用argrelmin时返回27个元素-有27个相对最小值

e、 g

常规:

三、二、一、南、南、二十二、一、一、四、四、四、2、、三、三、四、一、一、四、1、、五、2、、四、五、二、一

带换行符:

三、二、一、南、南、二十二、一、一、四、四、四、2、、三、三、四、一、一、四、1、、五、2、、四、五、二、1.


注意:看起来您可以创建自己的比较器来处理NaN并将其传递给argrelextrema,但您仍然需要处理所有NaN情况,等等。

您是否检查了.argrelmin()为您的(重塑)数据实际返回的信号?您需要正确选择轴。举个简单的例子

IndexError: arrays used as indices must be of integer (or boolean) type
返回

data = np.array([[19, 11, 14, 14, 10],[19,21,12,14,11]])
scipy.signal.argrelmin(data)

这将为您提供引用的索引器

我想用我使用过的极小值来解决它。不是np.nanmin(数据,轴=2),而是np.nanmin(数据,轴=0),其中数据指的是原始数组。啊,好的。我明白你的意思。我已经更新了我的答案。是的,但这不是我想要的。我必须使用argrelminOk。这里有一个新的答案。我想我对你的问题有了更好的了解。是的,但是当我使用axis=0时,索引错误会出现,因为返回的索引是空的。但是当我使用axis=1时,它返回了27个元素而不是25个元素,结果不正确。
(array([], dtype=float64), array([], dtype=float64))