scipy中的简单计算:minima

时间:2014-05-06 17:10:50

标签: python numpy scipy

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]]])

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

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

但是,跟随错误。请问。

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

2 个答案:

答案 0 :(得分:1)

注意:我的python现在正处于fritz状态,因此我无法对此进行测试。如果我出错了,请告诉我。

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

总结:argrelmin返回空数组的原因是因为沿数据集的第一个轴没有相对最小值。另请注意,除非可以做出一些非常具体的假设(例如,数据正在增加,使用换行,并且没有nans),否则不保证您的数据集中有25个最小值。

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

例如,

规则:

3.,2.,1.,nan,nan,22.,1.,1.,4.,4.,4。, 2. ,3.,3, 4.,1.,1.,4., 1。,5。, 2。,4.,5.,2.,1。

with wrap:

3.,2.,1.,nan,nan,22.,1.,1.,4.,4.,4。, 2. ,3.,3, 4.,1.,1.,4., 1。,5., 2。,4.,5.,2。, 1. < /强>

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

答案 1 :(得分:1)

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

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

返回

(array([], dtype=float64), array([], dtype=float64))

然后给出您引用的IndexError。