让我们说我有以下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方法实现它。你有什么主意吗?提前致谢!
答案 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数组的应用程序会更有意义。我希望这很有帮助。