LesserKhan
LesserKhan

Reputation: 35

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

I am trying to find the x value at the maxima of a data set and the width of the peak each maxima is from. I have tired the code below, the first part correctly returns the peak x positions but once I add the second section it fails with the error message:

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

The code is below:

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)

This next part fails:

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

I have read the scipy documentation but I think the issue is more fundamental than that. How can I make the second part work? I'd like it to return the peak widths and show on a plot which peaks it has picked.

Thanks

Example data:

-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

Upvotes: 1

Views: 905

Answers (1)

jdamp
jdamp

Reputation: 1460

I think your problem is that y is a list, not a numpy array. The slicing operation y[peaks] will only work if both y and peaks are numpy arrays. So you should convert y before doing the slicing, e.g. as follows

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

This yields the following plot:

enter image description here

Upvotes: 4

Related Questions