“Клонирование” строки или векторов - столбцов

Иногда полезно "клонировать" строку или вектор - столбец к матрице. Путем клонирования я означаю преобразовывать вектор - строку такой как

[1,2,3]

В матрицу

[[1,2,3]
 [1,2,3]
 [1,2,3]
]

или вектор - столбец такой как

[1
 2
 3
]

в

[[1,1,1]
 [2,2,2]
 [3,3,3]
]

В matlab или октаве это сделано довольно легко:

 x = [1,2,3]
 a = ones(3,1) * x
 a =

    1   2   3
    1   2   3
    1   2   3

 b = (x') * ones(1,3)
 b =

    1   1   1
    2   2   2
    3   3   3

Я хочу повторить это в numpy, но неудачно

In [14]: x = array([1,2,3])
In [14]: ones((3,1)) * x
Out[14]:
array([[ 1.,  2.,  3.],
       [ 1.,  2.,  3.],
       [ 1.,  2.,  3.]])
# so far so good
In [16]: x.transpose() * ones((1,3))
Out[16]: array([[ 1.,  2.,  3.]])
# DAMN
# I end up with 
In [17]: (ones((3,1)) * x).transpose()
Out[17]:
array([[ 1.,  1.,  1.],
       [ 2.,  2.,  2.],
       [ 3.,  3.,  3.]])

Почему первый метод не был (In [16]) работа? Существует ли способ достигнуть этой задачи в Python более изящным способом?

136
задан Neuron 11 November 2019 в 01:53
поделиться

4 ответа

Вот изящный питонический способ сделать это:

>>> array([[1,2,3],]*3)
array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]])

>>> array([[1,2,3],]*3).transpose()
array([[1, 1, 1],
       [2, 2, 2],
       [3, 3, 3]])

проблема с [16] , похоже, в том, что транспонирование не влияет на массив. вам, вероятно, нужна матрица:

>>> x = array([1,2,3])
>>> x
array([1, 2, 3])
>>> x.transpose()
array([1, 2, 3])
>>> matrix([1,2,3])
matrix([[1, 2, 3]])
>>> matrix([1,2,3]).transpose()
matrix([[1],
        [2],
        [3]])
68
ответ дан 23 November 2019 в 23:37
поделиться

Если Вы имеете кадр данных панд и хотите сохранить dtypes, даже categoricals, это - быстрый способ сделать это:

import numpy as np
import pandas as pd
df = pd.DataFrame({1: [1, 2, 3], 2: [4, 5, 6]})
number_repeats = 50
new_df = df.reindex(np.tile(df.index, number_repeats))
0
ответ дан 23 November 2019 в 23:37
поделиться

Прежде всего, обратите внимание, что с операциями широковещательной передачи numpy обычно не требуется дублировать строки и столбцы. См. Описания this и this .

Но для этого, repeat и newaxis , вероятно, являются лучшим способом

In [12]: x = array([1,2,3])

In [13]: repeat(x[:,newaxis], 3, 1)
Out[13]: 
array([[1, 1, 1],
       [2, 2, 2],
       [3, 3, 3]])

In [14]: repeat(x[newaxis,:], 3, 0)
Out[14]: 
array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]])

Этот пример предназначен для вектора-строки, но, надеюсь, применение его к вектору-столбцу очевидно. Кажется, что повторение хорошо написано, но вы также можете сделать это с помощью умножения, как в вашем примере

In [15]: x = array([[1, 2, 3]])  # note the double brackets

In [16]: (ones((3,1))*x).transpose()
Out[16]: 
array([[ 1.,  1.,  1.],
       [ 2.,  2.,  2.],
       [ 3.,  3.,  3.]])
36
ответ дан 23 November 2019 в 23:37
поделиться

Используйте numpy.tile :

>>> tile(array([1,2,3]), (3, 1))
array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]])

или для повторяющихся столбцов:

>>> tile(array([[1,2,3]]).transpose(), (1, 3))
array([[1, 1, 1],
       [2, 2, 2],
       [3, 3, 3]])
259
ответ дан 23 November 2019 в 23:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: