是否可以将矩阵存储在列表中或作为 Python 中的可迭代元素?

Is it possible to store matrices in a list or as iterable elements in Python?

我的 Python 代码通过一个名为 i.

的索引循环生成一些矩阵(一次一个)

存储名称如 mat_0, mat_1,..., mat_i 的矩阵很简单,但我想知道是否有可能以某种方式存储像 mat[0], mat[1],...,mat[i] 这样的可迭代元素的矩阵?

注意:矩阵以scipy稀疏coo_matrix格式存储。

编辑 1:索引 i 不一定遵循正确的顺序,可能会遍历某些随机数,例如 0,2,3,7,... 在这种情况下,矩阵必须存储为 mat[0], mat[2], mat[3], mat[7],...等等。

编辑 2:最小工作代码

import numpy as np
from math import sqrt
from scipy.sparse import coo_matrix, csr_matrix

primesqt = np.array([1.41421356, 1.73205080, 2.23606797, 2.64575131, 3.31662479, 3.60555127, 4.12310562, 4.35889894, 4.79583152, 5.38516480, 5.56776436, 6.08276253, 6.40312423, 6.55743852, 6.85565460, 7.28010988, 7.68114574, 7.81024967, 8.18535277, 8.42614977, 8.54400374, 8.88819441, 9.11043357, 9.43398113, 9.84885780, 10.04987562, 10.14889156, 10.34408043, 10.44030650, 10.63014581, 11.26942766, 11.44552314, 11.70469991, 11.78982612, 12.20655561, 12.28820572, 12.52996408, 12.76714533, 12.92284798, 13.15294643, 13.37908816, 13.45362404, 13.82027496, 13.89244398, 14.03566884, 14.10673597, 14.52583904, 14.93318452, 15.06651917, 15.13274595])

def bg(n, k, min_elem, max_elem):
    allowed = range(max_elem, min_elem-1, -1)

    def helper(n, k, t):
        if k == 0:
            if n == 0:
                yield t
        elif k == 1:
            if n in allowed:
                yield t + (n,)
        elif min_elem * k <= n <= max_elem * k:
            for v in allowed:
                yield from helper(n - v, k - 1, t + (v,))
    return helper(n, k, ())

def BinarySearch(lys, val):  
    first = 0
    last = len(lys)-1
    index = -1
    while (first <= last) and (index == -1):
        mid = (first+last)//2
        if lys[mid] == val:
            index = mid
        else:
            if val<lys[mid]:
                last = mid -1
            else:
                first = mid +1
    return index

m = 4
dim = 16
nmax = 1

a = []
for n in range(0,(nmax*m)+1):
    for x in bg(n, m, 0, nmax):
        a.append(x)

T = np.zeros(dim)
for ii in range(dim):
    for jj in range(m):
        T[ii] += primesqt[jj]*float(a[ii][jj])
ind = np.argsort(T)
T = sorted(T)

all_bs = [0,2,3,7] # i_list
# Evaluate 'mat_ee' for each 'ee' given in the list 'all_bs'
for ee in all_bs:
    row = []
    col = []
    val = []
    for ii in range(m):
        for vv in range(dim):
            Tg = 0
            if a[vv][ii]+1 < nmax+1:
                k = np.copy(a[vv])
                elem = sqrt(float(k[ii]+1.0))+ee
                k[ii] = k[ii]+1
                # Generate tag Tg for elem != 0
                for jj in range(m):
                    Tg += float((primesqt[jj])*k[jj])
                # Search location of non-zero element in sorted T
                location = BinarySearch(T, Tg)
                uu = ind[location]
                row.append(uu)
                col.append(vv)
                val.append(elem)
                mat_ee = (coo_matrix((val, (row, col)), shape=(dim, dim)).tocsr()) # To be stored as mat[0], mat[2], mat[3], mat[7]
    print(mat_ee)


您可以使用对象列表。

items_list = list()
for something:
    result = function
    items_list.append(result)

字典允许您使用任意(但不可变)对象来引用对象。在您的情况下,您可以使用 ee 索引在外循环(for ee in all_bs:)的每次迭代中存储矩阵 mat_ee

csr_matrices = {}
for ee in all_bs:
  # your inner loops, all the way to…
  mat_ee = (coo_matrix((val, (row, col)),
                       shape=(dim, dim))
            .tocsr())
  csr_matrices[ee] = mat_ee

从那时起,您可以使用在 all_bs:

中的索引访问字典的元素
print(csr_matrices[2])

当您检查字典时,您会发现它只包含您指定的键:

print(csr_matrices.keys())