Scipy peak_widths返回TypeError:只能将整数标量数组转换为标量索引

时间:2019-04-04 13:58:54

标签: python scipy

我正在尝试查找数据集最大值处的x值以及每个最大值所来自的峰的宽度。我已经厌倦了下面的代码,第一部分正确地返回了峰值x位置,但是一旦我添加了第二部分,它就会失败并显示错误消息:

TypeError: only integer scalar arrays can be converted to a scalar index

代码如下:

import matplotlib.pyplot as plt
import csv
from scipy.signal import find_peaks, find_peaks, peak_widths
import numpy
x = []
y = []

with open('data.csv','r') as csvfile:
    plots = csv.reader(csvfile, delimiter=',')
    for row in plots:
        x.append(float(row[0]))
        y.append(float(row[1]))

peaks = find_peaks(y, height=10000,) # set the height to remove background

list = numpy.array(x)[peaks[0]]
print("Optimum values")
print(list)

下一部分失败:

peaks, _ = find_peaks(y)
results_half = peak_widths(y, peaks, rel_height=0.5)
print(results_half)
results_full = peak_widths(y, peaks, rel_height=1)

plt.plot(y)
plt.plot(peaks, y[peaks], "y")
plt.hlines(*results_half[1:], color="C2")
plt.hlines(*results_full[1:], color="C3")
plt.show()

我已经阅读了scipy文档,但我认为这个问题比这更根本。如何使第二部分起作用?我希望它返回峰宽,并在它选择的峰上显示。

谢谢

示例数据:

-7  16
-6.879  14
-6.759  20
-6.638  31
-6.518  33
-6.397  28
-6.276  17
-6.156  17
-6.035  30
-5.915  50
-5.794  64
-5.673  77
-5.553  96
-5.432  113
-5.312  112
-5.191  113
-5.07   123
-4.95   151
-4.829  173
-4.709  207
-4.588  328
-4.467  590
-4.347  1246
-4.226  3142
-4.106  7729
-3.985  18015
-3.864  40097
-3.744  85164
-3.623  167993
-3.503  302845
-3.382  499848
-3.261  761264
-3.141  1063770
-3.02   1380165
-2.899  1644532
-2.779  1845908
-2.658  1931555
-2.538  1918458
-2.417  1788508
-2.296  1586322
-2.176  1346871
-2.055  1086383
-1.935  831396
-1.814  590559
-1.693  398865
-1.573  261396
-1.452  174992
-1.332  139774
-1.211  154694
-1.09   235406
-0.97   388021
-0.849  616041
-0.729  911892
-0.608  1248544
-0.487  1579659
-0.367  1859034
-0.246  2042431
-0.126  2120969
-0.005  2081017
0.116   1925716
0.236   1684327
0.357   1372293
0.477   1064307
0.598   766824
0.719   535333
0.839   346882
0.96    217215
1.08    125673
1.201   68861
1.322   35618
1.442   16286
1.563   7361
1.683   2572
1.804   1477
1.925   1072
2.045   977
2.166   968
2.286   1030
2.407   1173
2.528   1398
2.648   1586
2.769   1770
2.889   1859
3.01    1980
3.131   2041
3.251   2084
3.372   2069
3.492   2012
3.613   1937
3.734   1853
3.854   1787
3.975   1737
4.095   1643
4.216   1548
4.337   1399
4.457   1271
4.578   1143
4.698   1022
4.819   896
4.94    762
5.06    663
5.181   587
5.302   507
5.422   428
5.543   339
5.663   277
5.784   228
5.905   196
6.025   158
6.146   122
6.266   93
6.387   76
6.508   67
6.628   63
6.749   58
6.869   43
6.99    27
7.111   13
7.231   7
7.352   3
7.472   3
7.593   2
7.714   2
7.834   2
7.955   3
8.075   2
8.196   1
8.317   1
8.437   2
8.558   3
8.678   2
8.799   1
8.92    2
9.04    4
9.161   7
9.281   4
9.402   3
9.523   2
9.643   3
9.764   4
9.884   6
10.005  7
10.126  4
10.246  2
10.367  0
10.487  0
10.608  0
10.729  0
10.849  0
10.97   0
11.09   1
11.211  2
11.332  3
11.452  2
11.573  1
11.693  0
11.814  0
11.935  0
12.055  0
12.176  0
12.296  0
12.417  0
12.538  0
12.658  0
12.779  0
12.899  0
13.02   0
13.141  0
13.261  0
13.382  0
13.503  0
13.623  0
13.744  0
13.864  0
13.985  0
14.106  0
14.226  0
14.347  0
14.467  0
14.588  0
14.709  0
14.829  0
14.95   0
15.07   0
15.191  0
15.312  0
15.432  0
15.553  0
15.673  0
15.794  0
15.915  0
16.035  0
16.156  0
16.276  0
16.397  1
16.518  2
16.638  3
16.759  2
16.879  2
17  4

1 个答案:

答案 0 :(得分:0)

我认为您的问题是y是一个列表,而不是一个numpy数组。 切片操作y[peaks]仅在y和波峰均为numpy数组时有效。 因此,您应该在进行切片之前转换y,例如如下

y_arr = np.array(y)
plt.plot(y_arr)
plt.plot(peaks, y_arr[peaks], 'o', color="y")
plt.hlines(*results_half[1:], color="C2")
plt.hlines(*results_full[1:], color="C3")
plt.show()
plt.show()

这将产生以下图:

enter image description here