Python 在循环中堆叠numpy阵列的最快方法是什么?

Python 在循环中堆叠numpy阵列的最快方法是什么?,python,numpy,Python,Numpy,我有一个代码,它在一个循环中为两个numpy数组(data\u transform)生成我。在第一个循环中生成(40,2)的numpy数组,在第二个循环中生成(175,2)的numpy数组。我想把这两个数组连接成一个数组,给我一个(215,2)数组。我尝试了使用np.concatenate和np.append,但它给了我一个错误,因为数组的大小必须相同。下面是我如何编写代码的示例: result_arr = np.array([]) for label in labels_set: d

我有一个代码,它在一个
循环中为两个numpy数组(
data\u transform
)生成我。在第一个循环中生成
(40,2)
的numpy数组,在第二个循环中生成
(175,2)
的numpy数组。我想把这两个数组连接成一个数组,给我一个
(215,2)
数组。我尝试了使用
np.concatenate
np.append
,但它给了我一个错误,因为数组的大小必须相同。下面是我如何编写代码的示例:

result_arr = np.array([])

for label in labels_set:
    data = [index for index, value in enumerate(labels_list) if value == label]
    for i in data:
        sub_corpus.append(corpus[i])
    data_sub_tfidf = vec.fit_transform(sub_corpus) 
    data_transform = pca.fit_transform(data_sub_tfidf) 
    #Append array
    sub_corpus = []

我还使用了
np.row\u stack
,但是没有其他任何东西给我一个
(175,2)
的值,这是我想要连接的第二个数组

使用连接,初始化“c”:

输出:

[[8. 3. 1.]
 [2. 5. 1.]
 [6. 5. 2.]
 [2. 5. 1.]
 [2. 5. 2.]]

如果您有一个大小为
(40,2)
的数组
a
,和一个大小为
(175,2)
的数组
b
,您只需使用
np.concatenate([a,b])
(175,2)

使用@hpaulj试图表达的意思,就可以得到一个大小为
(215,2)
的最终数组

执行循环时,请坚持使用列表附加


您的阵列实际上没有不同的维度。它们有一个不同的维度,另一个维度是相同的。在这种情况下,您可以始终沿着“不同”维度进行堆叠。

您可以在开始时分配
result\u arr
。为什么?然后在循环中再次赋值-但不要将其用作
行堆栈的参数。您是否试图模拟列表
append
loop?@hpaulj我试图创建一个空数组来填充它。我只想做我在
列表中附加值时所做的操作;不要试图用数组来模仿它。在最后一步制作数组。
alist.append(x)
alist
上操作到位<代码>np。行堆栈(数据转换)
返回一个新数组。它不使用或操作
result\u arr
,该表达式中根本不显示该结果。
result\u arr=…
步骤只是将以前的值替换为新值。语法与列表代码完全不同。@hpaulj我知道,但我想执行
alist.append()
所做的操作,但要使用
numpy
。重复的
串联
很慢。在做循环时,请坚持使用列表附加。我将您的评论变成了答案,希望您不介意:)@Manuel、
np.append()
np.concatenate()
在for循环中使用时都很慢,它们在幕后基本上做相同的事情。我知道。问题是我没有两个数组,只有一个。变量
data\u transform
在每个循环中都会发生变化。谢谢你的回答,这对我很有帮助。这里的
np.concatenate
np.stack
之间真的有区别吗?concatenate似乎将它们按列排列到矩阵中,而stack似乎将它们按行堆叠在一起。。
[[8. 3. 1.]
 [2. 5. 1.]
 [6. 5. 2.]
 [2. 5. 1.]
 [2. 5. 2.]]
#use a normal list
result_arr = []

for label in labels_set:

    data_transform = pca.fit_transform(data_sub_tfidf) 

    # append the data_transform object to that list
    # Note: this is not np.append(), which is slow here
    result_arr.append(data_transform)

# and stack it after the loop
# This prevents slow memory allocation in the loop. 
# So only one large chunk of memory is allocated since
# the final size of the concatenated array is known.

result_arr = np.concatenate(result_arr)

# or 
result_arr = np.stack(result_arr, axis=0)

# or
result_arr = np.vstack(result_arr)