我有一个包含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。
答案 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))