有关Python中numpy的问题

时间:2015-09-07 13:06:40

标签: python arrays numpy

我使用普通的Python编写了一个程序,现在我认为使用numpy而不是标准列表要好得多。问题是有很多事情我很困惑如何使用numpy,或者我是否可以使用它。

  1. 一般来说np.arrays是如何工作的?它们的大小是否像C ++向量一样动态,或者我是否像标准C ++数组一样事先声明了它们的长度和类型?在我的程序中,我有很多我创建列表的情况 ex_list = []然后循环浏览某些内容并附加到ex_list.append(some_lst)。我可以用numpy数组做一些事吗?如果我知道ex_list的大小,我可以声明并清空一个然后再添加它吗?
  2. 如果我不能,让我说我只打电话给这个列表,之后将它转换为numpy是否值得,即更快地调用numpy列表?

    1. 我可以使用numpy数组为每个元素执行更复杂的操作(不只是为每个元素添加5个),例如下面的示例。

      full_pallete = [(int(1+i*(255/127.5)),0,0) for i in range(0,128)]

      full_pallete += [col for col in right_palette if col[1]!=0 or col[2]!=0 or col==(0,0,0)]

    2. 换句话说,转换为numpy数组然后使用for for循环之外的其他内容是否有意义?

1 个答案:

答案 0 :(得分:1)

  1. 可以将Numpy数组附加到(请参阅http://docs.scipy.org/doc/numpy/reference/generated/numpy.append.html),尽管通常在循环中多次调用append函数会产生很高的性能成本 - 通常情况下预先更好分配一个大型数组,然后根据需要填充它。这是因为数组本身在引擎盖下确实有固定的大小,但这在python中是隐藏的。

  2. 是的,Numpy专为许多与此类似的操作而设计。但是,一般情况下,如果它们非常大,您不希望循环遍历numpy数组(或一般在python中的数组)。通过使用内置的numpy函数,您基本上可以利用各种编译的加速优势。作为示例,您可以使用numpy.where()而不是循环并检查条件的每个元素。

  3. 使用numpy的真正原因是受益于大型数组上的预编译数学函数和数据处理实用程序 - 核心numpy库中的那些以及使用它们的许多其他包。