【问题标题】:What is the fastest way to stack numpy arrays in a loop?在循环中堆叠 numpy 数组的最快方法是什么?
【发布时间】:2019-09-24 15:33:49
【问题描述】:

我有一个代码可以在for 循环中生成两个 numpy 数组 (data_transform)。在第一个循环中生成一个(40, 2) 的numpy 数组,在第二个循环中生成一个(175, 2)。我想将这两个数组连接成一个,给我一个(215, 2) 的数组。我尝试使用np.concatenatenp.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_stack,但没有其他任何东西给我(175, 2) 的值,这是我要连接的第二个数组。

【问题讨论】:

  • 您在开始时分配result_arr。为什么?然后在循环中再次分配它 - 但不要将它用作row_stack 的参数。你是在模仿append循环列表吗?
  • @hpaulj 我尝试创建一个空数组来填充它。我只想执行将值附加到 list 时所做的操作。
  • 坚持列表追加;不要试图用数组来模仿它。最后一步制作数组。
  • alist.append(x)alist 上就地运行。 np.row_stack(data_transform) 返回一个新数组。它不会使用或操作result_arr,它根本不会出现在该表达式中。 result_arr=... 步骤只是将先前的值替换为新值。语法与列表代码完全不同。
  • @hpaulj 我知道,但我想执行alist.append() 所做的操作,但使用numpy

标签: python numpy


【解决方案1】:

@hpaulj 想说什么

在循环时坚持使用列表追加。

#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)

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

【讨论】:

  • 谢谢你的回答真的对我有帮助。
  • 这里np.concatenatenp.stack之间真的有区别吗? concatenate 似乎将它们逐列排列到矩阵中,而 stack 似乎将它们逐行堆叠在彼此之上..
【解决方案2】:

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

a = np.array([[8,3,1],[2,5,1],[6,5,2]])
b = np.array([[2,5,1],[2,5,2]])
matrix = [a,b]

c = np.empty([0,matrix[0].shape[1]])

for v in matrix:
    c = np.append(c, v, axis=0)

输出:

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

【讨论】:

  • 重复concatenate 很慢。在循环时坚持使用列表追加。
  • 我把你的评论变成了答案,希望你不介意:)
  • @Manuel、np.append()np.concatenate() 在 for 循环中使用时都很慢,它们基本上在幕后做同样的事情。
【解决方案3】:

如果您有一个大小为(40, 2) 的数组a 和一个大小为(175,2) 的数组b,您可以使用np.concatenate([a,b]) 简单地获得一个大小为(215, 2) 的最终数组。

【讨论】:

  • 我知道。问题是我没有两个数组,只有一个。变量data_transform 在每个循环中都会发生变化。
猜你喜欢
  • 2011-07-17
  • 2017-03-28
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2023-03-29
  • 2021-07-10
相关资源
最近更新 更多