将np矩阵及其索引转换为两个列表

时间:2019-02-07 09:55:33

标签: python list numpy

我有以下矩阵。

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']

有人可以建议吗? 如果可能的话,我想为上述过程创建一个函数。

谢谢

压缩。

4 个答案:

答案 0 :(得分:1)

对于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)]

答案 1 :(得分:1)

您可以遍历元素-

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)

答案 2 :(得分:1)

这是使用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']

答案 3 :(得分:0)

您可以在上面的更改中使用上述答案-

list2 = ['{}-{}'.format(x,y) for x in range(len(data)) for y in [len(i) for i in data]