如何存储不均匀的numpy数组列表?

时间:2016-06-20 04:03:22

标签: python arrays numpy

让我们说我有以下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))之类的操作?我知道有一种纯粹的蟒蛇方式l = [a, b, c],但这种方式效率不高。我想用一种numpy方法实现它。你有什么主意吗?提前致谢!

2 个答案:

答案 0 :(得分:1)

In [863]: a = np.array([1, 2])
In [864]: b = np.array([1])
In [865]: c = np.array([1, 4, 8, 10])

这3个阵列的列表:

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和其他对象数组问题。

答案 1 :(得分:0)

要获得numpy速度,您需要将矢量嵌入到数组中。 2D阵列或1D阵列都可以工作。您可以创建一个足够大的零数组来保存所有值。然后将矢量放在该数组中。或者,您可以创建一个大的一维数组并将这些向量端对端连接起来。

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阵列可能会更好。使用2D数组,您可以保持矢量的特定元素对齐。

但是,我还可以想象将向量连接成单个1D数组的应用程序会更有意义。我希望这很有帮助。