Ошибка преобразования списка в массив NumPy - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть список, состоящий из 2000 строк и 88200 столбцов:

testlist = list(split_audio_to_parts(audio, self.sample_rate, self.audio_index))

вывод отладки testlist дает

[array([-0.00683594, -0.00689697, -0.00708008, ...,  0.        ,
    0.        ,  0.        ]), array([-0.01287842, -0.01269531, -0.01257324, ...,  0.        ,
    0.        ,  0.        ]), array([0.02288818, 0.01940918, 0.01409912, ..., 0.        , 0.        ,
   0.        ]), array([0.00772095, 0.00671387, 0.00695801, ..., 0.        , 0.        ,
   0.        ]),

и так далее. split_audio_to_parts - это функция:

def split_audio_to_parts(x, sample_rate, audio_index):
for i, row in audio_index.iterrows():
    x_part = x[int(row['start_samples']):int(row['end_samples'])]
    yield x_part

Когда я пытаюсь преобразовать его в массив с использованием samples = np.array(testlist) или samples = np.asarray(testlist), он дает мне массив формы (2000,), хотя отладка показывает, что testlist состоит из 2000 записей с 88200 позициями. Почему так? Я использую 64-битный Numpy и 64-битный Python 3.6.5.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Проблема в testlist - это список массивов разных размеров. Например оформить заказ этот код:

>>>import numpy as np
>>>import random 
>>>random.seed(3240324324)
>>> y=[np.array(list(range(random.randint(1,3)))) for _ in range(3)]
>>> y
[array([0, 1, 2]), array([0, 1, 2]), array([0])]
>>> np.array(y)
array([array([0, 1, 2]), array([0, 1, 2]), array([0])], dtype=object)
>>> np.array(y).shape
(3,)

и массив будет иметь тип object вместо float. единственный способ для этого - использовать массивы одинакового размера.

Если вам действительно нужно как-то скомпоновать эти строки в массив, вы можете заполнить нулями, например:

>>> size = y[max(enumerate(y),key=lambda k:k[1].shape)[0]].shape[0]
>>> z=[np.append(x,np.zeros(size-x.shape[0])) for x in y]
>>> z
[array([ 0.,  1.,  2.]), array([0, 1, 2]), array([0, 0, 0])]
>>>np.array(z).shape
(3, 3)

но вы должны решить, как вы делаете это заполнение.

0 голосов
/ 27 апреля 2018

У вас есть список массивов. Если каждый массив в вашем списке не имеет одинаковую длину, ваше преобразование не будет успешным.

Вот минимальный пример.

A = [np.array([1, 2]), np.array([4, 5, 6])]

A_2 = np.array(A)
# array([array([1, 2]), array([4, 5, 6])], dtype=object)

A_2.shape
# (2,)

Если длины ваших массивов выровнены, проблем не будет:

B = [np.array([1, 2, 3]), np.array([4, 5, 6])]

B_2 = np.array(B)
# array([[1, 2, 3],
#        [4, 5, 6]])

B_2.shape
# (2, 3)

Чтобы проверить размеры ваших массивов, вы можете использовать set:

array_sizes = set(map(len, A))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...