Numpy:如何将(N,)维向量作为沿D轴的新元素插入(N,M,D)维数组? (N,M,D + 1)

时间:2018-03-11 19:35:01

标签: python arrays numpy numpy-broadcasting

conversations.replies是一个形状为a的数组。

(N, M, D) == (20, 4096, 6)是一个形状为b的数组。

我想将(N,) == (20,)的值插入b,以便a中的每个值都按元素添加到b dim D中}(a中的第7个元素)。

因此a将是一个形状为c的数组,其中(20, 4096, 7)适用于所有c[i,:,-1] == b[i]i

我知道您可以创建一个新数组并相应地添加值,例如:

c[...,:-1] == a

但是想知道这里的一个numpy向导是否有一个更灵巧的方式来做这个与numpy操作和没有中间数组。

2 个答案:

答案 0 :(得分:1)

在将b扩展到3D之后沿第二个轴复制a,然后沿最后一个轴与b_rep = np.repeat(b[:,None,None],a.shape[1],axis=1) out = np.concatenate((a, b_rep,axis=-1) 连接 -

np.broadcast_to

或者,我们可以使用b_rep = np.broadcast_to(b[:,None,None], (len(b), a.shape[1],1) 创建复制版本:

browser = webdriver.Chrome('C:\chromedriver.exe')
browser.get('https://www.premierleague.com/players/4330/player/stats?co=1&se=79')

wait = WebDriverWait(browser, 10)
wait.until(
    EC.element_to_be_clickable(
        (By.XPATH, "//*[@role='button'][text()='2017/18']")))

html = browser.page_source
soup = bs(html, 'lxml')

答案 1 :(得分:1)

这是另一个单行

np.r_['2,3,0', a, np.broadcast_to(b, (a.T.shape[1:])).T]

另外,我想提一下,您的原始方法实际上接近(或至少是)推荐的方式。只需使用empty代替zeros并广播而不是循环:

res = np.empty((N,M,D+1), np.promote_types(a.dtype, b.dtype))
res[..., :-1], res[..., -1] = a, b[:, None]

...

而且 - 只是为了好玩 - 还有一个,我明确不建议。 不要使用它!

np.where(np.arange(D+1)<D, np.lib.stride_tricks.as_strided(a, (N,M,D+1), a.strides), b[:, None, None])