Переполнение в коротких скалярах - PullRequest
0 голосов
/ 21 октября 2019

У меня есть большой массив файлов .wav (200 тыс. Образцов), загруженный с помощью scipy.io.wavfile. Я попытался составить гистограмму данных, используя matplotlib.pyplot hist с автоматическим биннингом. Он вернул ошибку:

ValueError: Number of samples, -72, must be non-negative.

Поэтому я решил сам установить бины, используя binwidth = 1000:

min_bin = np.min(data[peaks])
max_bin = np.max(data[peaks])
plt.hist(data[peaks], bins=np.arange(min_bin,max_bin, binwidth))

Когда я это делаю, выдает ошибку:

RuntimeWarning: overflow encountered in short_scalars
from scipy.io import wavfile

Вот типовые распечатки min_bin, max_bin, data:

Type min_bin: <class 'numpy.int16'> max_bin: <class 'numpy.int16'>
min_bin: -21231 max_bin: 32444
Type data <class 'numpy.ndarray'>

Проблема, похоже, связана с np.arange, который завершается сбоем, когда я предоставляю ему диапазон корзины изЗначения массива np.max и np.min .wav. Когда я вручную набираю целочисленные значения max и min в np.arange, это не проблема. Моя гипотеза состоит в том, что это какая-то ошибка адресации при обращении к массиву .wav, но я не уверен, как это исправить или почему это происходит.

1 Ответ

1 голос
/ 24 октября 2019

Не знаю точно, почему это происходит (возможно, это ошибка в numpy), но кажется, что передача двух np.int16 s np.arange приводит к ее поломке. Я попробовал это в консоли Python, и он просто дал мне пустой массив.

Обходной путь прост;сначала преобразуйте аргументы в int s. Для экономии места dtype самого массива по-прежнему можно установить равным np.int16, поскольку это все, что вам нужно для хранения необходимых данных.

min_bin = int(np.min(data[peaks]))
max_bin = int(np.max(data[peaks]))
plt.hist(data[peaks], bins=np.arange(min_bin, max_bin, binwidth), dtype=np.int16)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...