我正在运行以下代码:
for i in range(1000)
My_Array=numpy.concatenate((My_Array,New_Rows[i]), axis=0)
上述代码运行缓慢。有更快的解决方法吗?
我正在运行以下代码:
for i in range(1000)
My_Array=numpy.concatenate((My_Array,New_Rows[i]), axis=0)
上述代码运行缓慢。有更快的解决方法吗?
import numpy as np
arr = np.zeros((len(l),)+l[0].shape)
for i, v in enumerate(l):
arr[i] = v
对我来说运行速度更快,它只需要一个内存分配
这取决于 New_Rows[i]
是什么,以及您想要什么类型的数组。如果您从要连接在一起的列表(或1d数组)开始(以创建长1d数组),只需一次性将它们全部连接即可。Concatenate接受任意长度的列表,而不仅限于2个项目。
np.concatenate(New_Rows, axis=0)
或者使用中间列表推导式(更加灵活)
np.concatenate([row for row in New_Rows])
np.concatenate([New_Rows[i] for i in range(1000)])
但是,如果New_Rows
元素长度相同,并且您想要一个二维数组,每行一个New_Rows
值,那么np.array
可以很好地完成这项工作:
np.array(New_Rows)
np.array([i for i in New_Rows])
np.array([New_Rows[i] for i in range(1000)])
np.array
主要用于将列表转换为数组。
np.concatenate
也可以构建2D数组,但需要输入的数据本身就是2D的。vstack
和stack
可以解决这个问题。但所有这些stack
函数都使用一些列表推导式,然后跟上concatenate
。
一般来说,使用列表迭代或附加更好/更快,并只在最后使用np.array
(或concatenate)。append
到一个列表很快,比创建新数组要快得多。
假设您有一个大的2D numpy数组列表,具有相同的列数和不同的行数,例如:
x = [numpy_array1(r_1, c),......,numpy_arrayN(r_n, c)]
像这样连接:
while len(x) != 1:
if len(x) == 2:
x = np.concatenate((x[0], x[1]))
break
for i in range(0, len(x), 2):
if (i+1) == len(x):
x[0] = np.concatenate((x[0], x[i]))
else:
x[i] = np.concatenate((x[i], x[i+1]))
x = x[::2]
x = [np.zeros(2000) for _ in range(1000)]
运行了这个程序。它大约需要50毫秒的时间。而 np.concatenate(x)
(参见@hpaulj的答案) 只需要2毫秒的时间。你的方法肯定比问题中给出的方法更快,但比numpy的最佳实践要慢得多。 - user2699
list
实际上是一个数组(内部)。它肯定会执行一些技巧,如在增长时保留空槽,并具有良好的平摊复杂度,但经典的链表可能会更快(取决于许多因素)。 - sascha