преобразование матрицы np и ее индексов в два списка - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть следующая матрица.

data = np.matrix([[0,0.5,0.3,0.4,0.5,0.6], [0,2,3,4,5,6],[0,2.2,3.5,4.4,5.5,6.5]])

Я хочу создать два списка, которые содержат каждый элемент из матрицы и соответствующий ему индекс в виде строки.мой ожидаемый результат следующий:

list1 = [0,0.5,0.3,0.4,0.5,0.6,0,2,3,4,5,6,0,2.2,3.5,4.4,5.5,6.5]
list2 = ['0-0','0-1','0-2','0-3','0-4','0-5',
         '1-0','1-1','1-2','1-3','1-4','1-5',
         '2-0','2-1','2-2','2-3','2-4','2-5']

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

Спасибо,

zep.

Ответы [ 4 ]

0 голосов
/ 07 февраля 2019

Вы можете использовать ответ выше с этим незначительным изменением -

list2 = ['{}-{}'.format(x,y) for x in range(len(data)) for y in [len(i) for i in data]
0 голосов
/ 07 февраля 2019

Вы можете перебирать элементы -

def createlist(data):
    ls1=[]
    ls2=[]
    for i in range(data.shape[0]):
        for j in range(data.shape[1]):
            ls1.append(data[i, j])
            ls2.append(str(i)+ "-" + str(j))
    return ls1, ls2

Вызовите эту функцию с вашей матрицей-

createlist(data)
0 голосов
/ 07 февраля 2019

Вот способ сделать это с NumPy:

import numpy as np

data = np.matrix([[  0, 0.5, 0.3, 0.4, 0.5, 0.6],
                  [  0,   2,   3,   4,   5,   6],
                  [  0, 2.2, 3.5, 4.4, 5.5, 6.5]])
ind = np.indices(data.shape).astype(str)
list1 = data.ravel().tolist()[0]
list2 = np.char.add(np.char.add(ind[0], '-'), ind[1]).ravel().tolist()
print(list1)
print(list2)

Вывод:

[0.0, 0.5, 0.3, 0.4, 0.5, 0.6, 0.0, 2.0, 3.0, 4.0, 5.0, 6.0, 0.0, 2.2, 3.5, 4.4, 5.5, 6.5]
['0-0', '0-1', '0-2', '0-3', '0-4', '0-5', '1-0', '1-1', '1-2', '1-3', '1-4', '1-5', '2-0', '2-1', '2-2', '2-3', '2-4', '2-5']
0 голосов
/ 07 февраля 2019

Для массива numpy вы можете сделать следующее:

data = np.array([[0,0.5,0.3,0.4,0.5,0.6], [0,2,3,4,5,6],[0,2.2,3.5,4.4,5.5,6.5]])
list1 = data.ravel().tolist()
# [0.0, 0.5, 0.3, 0.4, 0.5, 0.6, 0.0, 2.0, 3.0, 4.0, 5.0, 6.0, 0.0, 2.2, 3.5, 4.4, 5.5, 6.5]

Вы можете использовать генератор для перебора различных длин подсписков:

g = (range(len(i)) for i in data)

Сборкасписок координат с списком и форматированием строки для получения желаемого результата:

list2 = [f'{x}-{y}' for x in range(len(data)) for y in next(g)]
#['0-0', '0-1', '0-2', '0-3', '0-4', '0-5', '1-0', '1-1', '1-2',
# '1-3', '1-4', '1-5', '2-0', '2-1', '2-2', '2-3', '2-4', '2-5']

И еще одна альтернатива - использовать scipy.sparse.csr_matrix:

from scipy.sparse import  csr_matrix
list1 = sm.toarray().ravel().tolist()
list2 = list(zip(*sm.nonzero()))
# [(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (1, 1), (1, 2), (1, 3), (1, 4), 
# (1, 5), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...