Как добавить несколько дополнительных столбцов в массив NumPy - PullRequest
0 голосов
/ 02 сентября 2018

Допустим, у меня есть два массива 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]) b?

Относится к этого вопроса , но с несколькими значениями.

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018

Первоначально я решил это так:

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

Но это кажется очень неэффективным ...

0 голосов
/ 02 сентября 2018

Альтернативой 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)
0 голосов
/ 02 сентября 2018

Вот один из способов. Я предполагаю, что это эффективно, потому что это векторизация. Он основан на том факте, что при умножении матриц предварительное умножение строки на столбец (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?

Окончательный результат содержит эти копии (а числовые массивы буквально являются массивами значений в памяти), поэтому я не вижу, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...