【问题标题】:Issue converting list to NumPy array将列表转换为 NumPy 数组的问题
【发布时间】:2018-10-08 15:43:26
【问题描述】:

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

【问题讨论】:

  • 您确定testlist 是列表列表吗?例如,您可以打印第一个条目或发送到并发布它们吗?
  • 请不要在 cmets 或图片中发布此类内容。使用edit 按钮改进您的问题,并将示例发布在代码块中。
  • 很好的编辑,谢谢。

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


【解决方案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 类型而不是浮点数。唯一可行的方法是拥有相同大小的数组。

如果你真的需要将这些行以某种方式填充到一个数组中,你可以用零填充,例如:

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

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

【讨论】:

    【解决方案2】:

    你有一个数组列表。如果列表中的每个数组的长度不同,则转换不会成功。

    这是一个最小的例子。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-02
      • 2017-03-08
      • 2021-12-30
      • 2019-08-30
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多