2017-04-05 124 views
1

我在Python中创建了一个N numpy数组的列表,其中每个数组的大小都是P。当我拨打numpy.shape(my_list)时,我找回了元组(N, D, P)。当我追加到我的列表中的数组大小不一样(或者如果我追加不是数组的项目),numpy.shape将引发错误。使用numpy数组的列表形状

  1. 如果我想要列表中的每个数组的形状,我必须求助于列表理解还是有更快的方法来做到这一点?
  2. numpy是否简单地遍历列表,检查以确保每个元素是一个大小与前一个相同的数组,并根据是否返回元组或者抛出错误来决定?
+0

1)是,2)可能是 –

+0

列表不是一个numpy数据类型。没有“无规律”的迭代方式,所以列表理解是唯一的选择。当你调用'numpy.shape(my_list)'时,隐式创建一个数组数组。为使此操作成功,列表中的所有数组必须具有相同的形状。 – DyZ

+0

请注意'my_list.shape'会给你一个错误。这是试图将列表转换为数组的函数形式。 – hpaulj

回答

1

如果我想在列表中的每个阵列的形状,我必须诉诸列出的理解还是有更快的方法来做到这一点?

列表理解。

是否numpy只是遍历列表,检查以确保每个元素是一个大小与前一个相同的数组,并根据是否返回一个元组或者抛出一个错误来决定?

NumPy calls asarray on the list,建立一个完整的数组只是为了获得形状。 (这不是任何人都想优化的东西。)

+0

'map(np.shape,list_of_arrays)'比列表理解更快吗? – kmario23

+0

@ kmario23:它的运行速度可能微不足道,但两种方式在运行时都非常接近,并且这两种方式都不会使此操作成为性能瓶颈。同样,直接访问'shape'属性会比使用'np.shape'更快,并且你不能用'map'来完成。 (直接访问shape属性应该是'[arr.shape for my_list中的arr]')。 – user2357112

+0

是的。发现运行一些测试后。顺便说一句,我提供了一个自定义的python函数到'map',它利用'arr.shape',发现它比列表理解慢2倍。但是,如果只需要一个可迭代的而不是整个列表本身,那么'map'就是要走的路。 – kmario23