如何将多个额外的列添加到NumPy数组

时间:2018-09-01 21:28:55

标签: python arrays numpy data-science

假设我有两个NumPy数组,ab

a = np.array([
    [1, 2, 3],
    [2, 3, 4]
    ])

b = np.array([8,9])

我想将相同的数组b附加到每一行(即添加多列)以获得一个数组c

b = np.array([
    [1, 2, 3, 8, 9],
    [2, 3, 4, 8, 9]
    ])

如何在NumPy中轻松高效地做到这一点?

我特别担心它在大型数据集中(ab大)的行为,有没有办法创建{的许多副本(即a.shape[0]) {1}}?

this question相关,但具有多个值。

3 个答案:

答案 0 :(得分:3)

这是一种方式。我认为它是有效的,因为它是矢量化的。它依赖于以下事实:在矩阵乘法中,将行与列(1、1)预先相乘会产生该行的两个堆叠副本。

import numpy as np

a = np.array([
    [1, 2, 3],
    [2, 3, 4]
    ])

b = np.array([[8,9]])

np.concatenate([a, np.array([[1],[1]]).dot(b)], axis=1)

Out: array([[1, 2, 3, 8, 9],
            [2, 3, 4, 8, 9]])

请注意,b的指定稍有不同(作为二维数组)。

  

有没有办法创建b的多个副本?

最终结果包含这些副本(而numpy数组实际上是内存中值的数组),所以我不知道如何。

答案 1 :(得分:2)

我最初解决此问题的方法是:

c = np.concatenate([a, np.tile(b, (a.shape[0],1))], axis = 1)

但这感觉效率很低...

答案 2 :(得分:2)

concatenate方法的替代方法是制作一个收件人数组,并将值复制到其中:

In [483]: a = np.arange(300).reshape(100,3)
In [484]: b=np.array([8,9])
In [485]: res = np.zeros((100,5),int)
In [486]: res[:,:3]=a
In [487]: res[:,3:]=b

采样时间

In [488]: %%timeit
     ...: res = np.zeros((100,5),int)
     ...: res[:,:3]=a
     ...: res[:,3:]=b
     ...: 
     ...: 
6.11 µs ± 20.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [491]: timeit np.concatenate((a, b.repeat(100).reshape(2,-1).T),1)
7.74 µs ± 15.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [164]: timeit np.concatenate([a, np.ones([a.shape[0],1], dtype=int).dot(np.array([b]))], axis=1) 
8.58 µs ± 160 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)