Объединение 3 массивов в 1 матрицу (Python 3) - PullRequest
0 голосов
/ 31 января 2019

У меня есть 3 массива равной длины (например):

  1. [a, b, c]
  2. [1, 2, 3]
  3. [i, ii, iii]

Я хотел бы объединить их в матрицу:

|a, 1, i  |
|b, 2, ii |
|c, 3, iii|

Проблема, с которой я столкнулся, заключается в том, что при использовании таких кодов, как dstack, hstack или concatenate.Я добавляю их численно или складываю так, чтобы я мог с ними работать.

Ответы [ 4 ]

0 голосов
/ 31 января 2019

Если у вас разные типы данных в каждом массиве, то имеет смысл использовать pandas для этого:

# Iterative approach, using concat
import pandas as pd
my_arrays = [['a', 'b', 'c'], [1, 2, 3], ['i', 'ii', 'iii']]
df1 = pd.concat([pd.Series(array) for array in my_arrays], axis=1)

# Named arrays
array1 = ['a', 'b', 'c']
array2 = [1, 2, 3]
array3 = ['i', 'ii', 'iii']
df2 = pd.DataFrame({'col1': array1,
                    'col2': array2,
                    'col3': array3})

Теперь у вас есть желаемая структура ссоответствующие типы данных для каждого столбца:

print(df1)
#    0  1    2
# 0  a  1    i
# 1  b  2   ii
# 2  c  3  iii

print(df2)
#   col1  col2 col3
# 0    a     1    i
# 1    b     2   ii
# 2    c     3  iii

print(df1.dtypes)
# 0    object
# 1     int64
# 2    object
# dtype: object

print(df2.dtypes)
# col1    object
# col2     int64
# col3    object
# dtype: object

Вы можете извлечь массив numpy с атрибутом .values:

df1.values
# array([['a', 1, 'i'],
#        ['b', 2, 'ii'],
#        ['c', 3, 'iii']], dtype=object)
0 голосов
/ 31 января 2019

это дает вам список кортежей, который может быть не тем, что вы хотите:

>>> list(zip([1,2,3],[4,5,6],[7,8,9]))
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

это дает вам пустой массив:

>>> from numpy import array
>>> array([[1,2,3],[4,5,6],[7,8,9]]).transpose()
array([[1, 4, 7],
       [2, 5, 8],
       [3, 6, 9]])
0 голосов
/ 31 января 2019

Предполагая, что у вас есть 3 пустых массива:

>>> a, b, c = np.random.randint(0, 9, 9).reshape(3, 3)
>>> print(a, b, c)
[4 1 4] [5 8 5] [3 0 2]

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

>>> np.vstack((a, b, c)).T
array([[4, 5, 3],
       [1, 8, 0],
       [4, 5, 2]])

Несколько более подробный пример - вместо этого складывать горизонтально, но для этого необходимо, чтобы ваши массивы были преобразованы в 2D с использованием reshape:

>>> np.hstack((a.reshape(3, 1), b.reshape(3, 1), c.reshape(3, 1)))
array([[4, 5, 3],
       [1, 8, 0],
       [4, 5, 2]])
0 голосов
/ 31 января 2019

Вы можете использовать zip () :

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

a1 = ['a', 'b', 'c']

b1 = ['1', '2', '3']

c1 =  ['i', 'ii', 'iii']


print(list(zip(a1,b1,c1)))

OUTPUT:

[('a', '1', 'i'), ('b', '2', 'ii'), ('c', '3', 'iii')]

EDIT:

Я только что подумал о том, чтобы сделать шаг вперед, как насчет того, чтобы потом свернуть список, а затем использовать numpy.reshape

flattened_list = []

#flatten the list
for x in res:
    for y in x:
        flattened_list.append(y)

#print(flattened_list)

import numpy as np
data = np.array(flattened_list)
shape = (3, 3)
print(data.reshape( shape ))

OUTPUT:

[['a' '1' 'i']
 ['b' '2' 'ii']
 ['c' '3' 'iii']]

ИЛИ

для одного вкладыша:

#flatten the list
for x in res:
    for y in x:
        flattened_list.append(y)

# print(flattened_list)

print([flattened_list[i:i+3] for i in range(0, len(flattened_list), 3)])

ВЫХОД:

[['a', '1', 'i'], ['b', '2', 'ii'], ['c', '3', 'iii']]

ИЛИ

Какпредложено @ norok2

print(list(zip(*zip(a1, b1, c1))))

ВЫХОД:

[('a', 'b', 'c'), ('1', '2', '3'), ('i', 'ii', 'iii')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...