【问题标题】:python convert list to matrix and get valuepython将列表转换为矩阵并获取值
【发布时间】:2019-04-02 10:48:56
【问题描述】:

我对 python 很陌生。我在嵌套列表中有 16 个 1 和 0 的列表。

list([name_of_matrix],[1234567812345678], [another_name],[1234....])

列表中的每个数字项[12345678....]代表一个 4x4 矩阵,如下所示:

1234
5678
1234
5678

我的目标是通过[row, col]. 访问一个数字例如[2,3] 将是第2 行col3,即7。我应该如何转换列表来实现这一点?提前谢谢了。

【问题讨论】:

  • 我不太明白你的问题。如果一个内部的list 代表一个 4x4 矩阵,这是否意味着整体结构应该是 4x4x4?
  • @gmds 它是一个 4x4 矩阵及其名称的列表,例如,它们每个都是 4x4。这是否更好地解释了它?我也编辑了问题
  • 感谢您的澄清!所以每个奇数元素都是一个字符串,表示紧跟在它后面的元素的名称,也就是一个list,包含一个16位整数,代表一个4x4矩阵?
  • @gmds 完全正确。我正在努力想出一个可以转换并使用 [row, col] 访问值的循环

标签: python list matrix nested nested-lists


【解决方案1】:

首先,您应该将嵌套的list 分解为dict,其中键是代表名称的字符串,值是整数:

nested_list = [['first'], [1234567812345678], ['second'], [1234432109877890]]
raw_dict = {k[0]: v[0] for k, v in zip(nested_list[::2], nested_list[1::2])}

现在,我们希望将每个 16 位整数转换为可以更好地表示矩阵的东西。 numpy 是一种方法,但现在让我们坚持使用基本的 Python。

请注意,如果我们将每个整数转换为字符串,则每个 4 字符块将代表矩阵的一行。因此:

def to_matrix(i):
    string = str(i)
    return [[int(element) for element in string[i:i + 4]] for i in range(0, 16, 4)]

matrix_dict = {k: to_matrix(v) for k, v in raw_dict.items()}

现在,我们的 dict 具有嵌套的值 lists 代表矩阵:

print(matrix_dict)

输出:

{'first': [[1, 2, 3, 4], [5, 6, 7, 8], [1, 2, 3, 4], [5, 6, 7, 8]], 'second': [[1, 2, 3, 4], [4, 3, 2, 1], [0, 9, 8, 7], [7, 8, 9, 0]]}

我们可以通过链式索引访问任意元素:

print(matrix_dict['first'][3][2])

输出:

7

编辑:如果我们不想区分列表,那么我们可以这样做:

matrices = [to_matrix(element[0]) for element in nested_list if isinstance(element[0], int)]

【讨论】:

  • 谢谢!有没有办法不使用字典?说如果原始列表结构有一个新项目,例如nested_list = [['first'], [nameOne],[1234567812345678], ['second'], [nameTwo],[1234432109877890]]
  • 您可以只提取那些元素为整数的lists,然后照常调用to_matrix。不过,您如何区分一个内部 list 和另一个?
  • 是的,我只需要提取元素为整数的列表。是的,这是关于区分内部列表的一个好点,在这一点上它对处理并不那么重要。但是如果有 3 个项目,很难将它们放入字典中,对吧?
  • @user4046073 这取决于您从哪里获取数据。我已经编辑了我的答案以处理您提出的第二种情况。
  • 非常感谢,您能否详细解释一下该方法,我应该通过的 element[0] 是什么?
【解决方案2】:

您只需将列表作为字符串传递给 list 方法,并从该列表中创建一个具有浮点类型的 numpy 数组:

my_matrix = np.array(list('1234567812345678'),dtype=float).reshape((4,4))

现在您可以像这样访问它:

my_matrix[2,3] #output 4

【讨论】:

    【解决方案3】:

    你可以使用字典:

    my_matrix_collection = {
        'name_one' : np.array([[1,2,3,4],[5,6,7,8],[1,2,3,4],[5,6,7,8]]),
        'name_two' : np.array([[10,20,30,40],[50,60,70,80],[10,20,30,40],[50,60,70,80]])
    }
    

    现在您可以访问特定矩阵的矩阵元素,例如:

    my_matrix_collection['name_one'][2,3] #output 4
    

    要从您的列表中获取字典my_matrix_collection(我们称之为my_list),请执行以下操作:

    my_matrix_collection = {} #create an empty dictionary
    for i in range(len(my_list)//2):
        my_matrix_collection[my_list[2*i]] = np.array(list(my_list[2*i+1]),dtype=float)).reshape((4,4)) #populate the empty dictionary
    

    【讨论】:

    • 问题是我有一个给定格式的现有列表,并且数字都在一行中..
    猜你喜欢
    • 1970-01-01
    • 2019-04-23
    • 2020-09-07
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多