Конвертировать множество массивов в одну матрицу - PullRequest
0 голосов
/ 14 января 2020

Мне нужно преобразовать много массивов в одну матрицу. Один массив должен стать одним столбцом, я использую np.column_stack, но у меня это не работает

[1 0 0 ... 0 0 1]
[1 0 0 ... 0 0 1]
[1 0 0 ... 0 0 1]
[1 0 0 ... 0 0 1]
[1 0 0 ... 0 0 1]
[1 0 0 ... 0 0 1]

до этого

[1 1 1 1 1 1
 0 0 0 0 0 0
 0 0 0 0 0 0 
 . . . . . .
 . . . . . .
 . . . . . .
 0 0 0 0 0 0
 0 0 0 0 0 0 
 1 1 1 1 1 1 ]

Ответы [ 4 ]

1 голос
/ 14 января 2020

Итак, у вас есть список массивов:

In [3]: alist = [np.array([1,0,0,1]) for i in range(3)]                                          
In [4]: alist                                                                                    
Out[4]: [array([1, 0, 0, 1]), array([1, 0, 0, 1]), array([1, 0, 0, 1])]

Объедините их, чтобы они стали строками массива 2d:

In [5]: np.vstack(alist)                                                                         
Out[5]: 
array([[1, 0, 0, 1],
       [1, 0, 0, 1],
       [1, 0, 0, 1]])

, чтобы стать столбцами:

In [6]: np.column_stack(alist)                                                                   
Out[6]: 
array([[1, 1, 1],
       [0, 0, 0],
       [0, 0, 0],
       [1, 1, 1]])

Код вашего комментария неясен, но:

for i in range(6): 
     np.column_stack((arrays[i]))

не имеет смысла и не следует column_stack документам. column_stack создает новый массив; он не работает на месте. Список append работает на месте и является хорошим выбором при итеративном построении списка, но его не следует рассматривать как модель для построения массивов итеративно.

Все функции concatenate и stack требуют список массивов в качестве входных данных. Воспользуйтесь этим. И помните, они возвращают новый массив при каждом вызове. (это относится и к np.append, но я не рекомендую использовать это).

Еще один вариант в семействе stack:

In [7]: np.stack(alist, axis=1)                                                                  
Out[7]: 
array([[1, 1, 1],
       [0, 0, 0],
       [0, 0, 0],
       [1, 1, 1]])
0 голосов
/ 14 января 2020

Я бы поместил все массивы в один список, а затем изменил его форму

import numpy as np
l=[[1,1,1,0,1,1],[1,0,0,1,0,1]]
l=np.reshape(l,len(l)*len(l[0]),1)
0 голосов
/ 14 января 2020

Так как вам нужно в основном вертикальное наложение 1D-массивов, имеет смысл использовать np.vstack и затем транспонировать результат, используя .T:

my_array = np.array([1,0,0,0,0,0,1])
result = np.vstack([my_array] * 6).T

Здесь я предполагаю, что вы просто копируете 1D массив 6 раз, но в качестве альтернативы вы можете передать список 1D массивов в качестве аргумента np.vstack.

0 голосов
/ 14 января 2020

Вы можете использовать numpy.asmatrix, как показано ниже. Последние шаги преобразуют матрицу в матрицу из одного столбца, как было запрошено.

РЕДАКТИРОВАТЬ Как указано hpaulj , np.array (ndarray) обычно используется более сейчас, но если вы используете тип matrix, решение ниже работает для этого примера.

import numpy as np

a1 = [ 1,  2,  3,  4, 5]
a2 = [ 6,  7,  8,  9, 10]
a3 = [11, 12, 13, 14, 15]

mat = np.asmatrix([a1, a2, a3])
mat
## matrix([[ 1,  2,  3,  4,  5],
##         [ 6,  7,  8,  9, 10],
##         [11, 12, 13, 14, 15]])

mat.shape
## (3, 5)

### If you want to reshape the final matrix
mat2 = mat.reshape(1, 15)
mat2.shape
## (1, 15)

### Convert to 1 column: You can also transpose it.
mat2.transpose().shape
## (15, 1)

...