【问题标题】:Efficient way to concatenate multiple numpy arrays连接多个numpy数组的有效方法
【发布时间】:2021-03-07 11:08:01
【问题描述】:

问题

我想连接多个具有形状 (1, N) 的二维 numpy 数组。 例如,假设我想连接多个np.array([1, 1])

我的低效解决方案

一种非常低效的方法如下:

main_array = np.array([])
for i in range(0, 10):    
    if main_array.size == 0:
        # necessary step otherwise the first time the two arrays have different shapes
        main_array = np.expand_dims(np.array([1, 1]), 0)                                                          
    else:
        main_array = np.concatenate((main_array, np.expand_dims(np.array([1, 1]), 0)))

正如预期的那样,结果是一个形状为 (10, 2) 的 numpy 数组。

问题

我怎样才能让这个操作更有效率?

编辑:

在我的示例中,为了简单起见,我添加了 10 次相同的数组。这可能令人困惑,因为我实际上正在寻找一种有效的方法来添加 any 数组,而不必是相同的。

【问题讨论】:

  • np.vstack([list of arrays])?
  • 对整个数组列表进行一个连接。列表理解或追加比重复连接更有效。

标签: python arrays numpy


【解决方案1】:

使用np.tile

代码

np.tile(np.array([1, 1]), (10, 1))
# Output: Same as OP
array([[1, 1],
       [1, 1],
       [1, 1],
       [1, 1],
       [1, 1],
       [1, 1],
       [1, 1],
       [1, 1],
       [1, 1],
       [1, 1]])

说明

函数np.tile

用法:np.tile(A, reps)

参数A

对象充当被复制和重复的“平铺”

  • Numpy 数组
  • Python 列表
  • Python 元组

参数代表

表示如果 reps 是一个整数那么 A 是如何重复输入数组 水平重复n次。如果 reps 是一个元组(例如 (r, c))

  • r 是向下重复的次数,并且
  • c 是重复次数。

垂直添加不同的数组

使用 vstack

arr1 = np.array([1, 1])
arr2 = np.array([2, 2])
arr3 = np.array([3, 3])
arr = [arr1, arr2, arr3]
np.vstack(arr)

# Output
array([[1, 1],
       [2, 2],
       [3, 3]])

【讨论】:

  • 谢谢,您回答了我的问题,因为在我的示例中,我添加了 10 次相同的数组。我实际上正在寻找一种更通用的方法来添加不同的数组,不一定是相同的数组。抱歉,我的问题不清楚。
  • @maurock - 扩展答案以显示添加不同的数组。这是你想要的吗?
  • 你的方法不需要if-else语句,也不需要增加维度,所以效率更高,谢谢!
  • @maurock--很高兴为您提供帮助。主要改进是避免 Python for 循环(相对于使用在 C 中执行循环的内置函数非常慢)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 2011-07-02
相关资源
最近更新 更多