假设我有两个NumPy数组,a
和b
:
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中轻松高效地做到这一点?
我特别担心它在大型数据集中(a
比b
大)的行为,有没有办法创建{的许多副本(即a.shape[0]
) {1}}?
与this question相关,但具有多个值。
答案 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)