将转换列表发送到NumPy数组

时间:2018-04-27 18:36:57

标签: python arrays python-3.x list numpy

我有一个包含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)将其转换为numpy数组时,它给出了我的形状数组(2000,),尽管调试显示testlist包含2000个条目88200个职位。为什么这样?我正在使用64位numpy和64位Python 3.6.5。

2 个答案:

答案 0 :(得分:1)

问题是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)

但你必须决定如何进行填充。

答案 1 :(得分:0)

您有一个数组列表。如果列表中的每个数组的长度不同,则转换将无法成功。

这是一个最小的例子。

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