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
答案 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。