【问题标题】:How to store a list of uneven numpy arrays?如何存储不均匀的numpy数组列表?
【发布时间】:2016-06-20 04:03:22
【问题描述】:

假设我有以下 numpy 数组:

import numpy as np
a = np.array([1, 2])
b = np.array([1])
c = np.array([1, 4, 8, 10])

我怎样才能在没有任何错误的情况下执行np.vstack((a, b, c)) 之类的操作?我知道有一种纯 python 方式l = [a, b, c] 但这还不够高效。我想用一个 numpy 方法来实现它。你有什么主意吗?提前致谢!

【问题讨论】:

  • 你怎么知道list方法效率不够?
  • 熊猫数据框怎么样?
  • 列表在什么意义上是无效的。记忆?跨数组的一些计算?对象 dtype 数组可以保存它们,但它与列表具有基本相同的限制。看np.array([a,b,c])
  • 更多关于对象 dtype 数组的信息:stackoverflow.com/a/37840862/901925
  • 我想这取决于你想如何使用这样一个不均匀的 numpy 数组列表。因为如果你用对象数据类型存储它,你就不能使用沿axes 操作的 NumPy 函数。那么,您能详细说明一下您想如何使用这样的数组列表吗?

标签: python arrays numpy


【解决方案1】:
In [863]: a = np.array([1, 2])
In [864]: b = np.array([1])
In [865]: c = np.array([1, 4, 8, 10])

这三个数组的列表:

In [866]: ll=[a,b,c]

由该列表组成的对象 dtype 数组:

In [867]: A=np.array(ll)

In [868]: A
Out[868]: array([array([1, 2]), array([1]), array([ 1,  4,  8, 10])], dtype=object)

A,像ll 包含指向内存中其他地方的数据对象的指针。在内存使用方面,它们同样有效。

In [870]: id(A[1]),id(b)
Out[870]: (3032501768, 3032501768)

您可以对A 的元素执行有限数量的数学运算,例如,加法可以按预期进行

In [871]: A+3
Out[871]: array([array([4, 5]), array([4]), array([ 4,  7, 11, 13])], dtype=object)

但是几乎没有速度优势,例如

In [876]: timeit [x+3 for x in ll]
100000 loops, best of 3: 9.52 µs per loop

In [877]: timeit  A+3
100000 loops, best of 3: 14.6 µs per loop

np.max 这样的其他东西不起作用。您必须逐案测试。

更多细节在这里:Maintaining numpy subclass inside a container after applying ufunc 和其他对象数组问题。

【讨论】:

    【解决方案2】:

    要获得 numpy 速度,您需要将向量嵌入到数组中。二维数组或一维数组都可以工作。您可以制作一个足够大的零数组来保存所有值。然后将向量放入该数组中。或者,您可以制作一个大型一维数组并将向量首尾相连。

    import numpy as np
    a = np.array([1, 2])
    b = np.array([1])
    c = np.array([1, 4, 8, 10])
    
    # Imbed the vectors in a 2D array 
    A = np.zeros((3, max(a.size, b.size, c.size)))
    A[0, :a.size] = a
    A[1, :b.size] = b
    A[2, :c.size] = c
    
    # 1D array imbedding
    B = np.zeros(a.size + b.size + c.size)
    B[:a.size] = a
    B[a.size:(a.size+b.size)] = b
    B[(a.size+b.size):] = c
    
    %timeit A+3
    
    1000000 loops, best of 3: 780 ns per loop
    
    %timeit B+3
    
    1000000 loops, best of 3: 764 ns per loop
    

    这具有 numpy 速度的优势。但它涉及到更多的编码工作,而且解释数组的值不太容易。

    此外,要确定 1D 解决方案还是 2D 解决方案更好,考虑如何使用数组是有意义的。例如,如果这些值是傅立叶级数系数​​,那么二维数组可能会更好。使用 2D 数组,您可以保持向量的特定元素对齐。

    但是,我也可以想象将向量连接到单个一维数组中的应用程序会更有意义。我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2021-06-07
      • 2011-02-08
      • 2016-12-16
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 2022-01-19
      • 2012-03-03
      相关资源
      最近更新 更多