在python中定义一个未知大小的矩阵

时间:2017-10-26 05:07:12

标签: python numpy

我想在我的Python代码中使用矩阵,但我不知道我的矩阵的确切大小来定义它。

对于其他矩阵,我使用了np.zeros(a),其中a已知。

如何定义未知大小的矩阵?

4 个答案:

答案 0 :(得分:2)

在这种情况下,也许一种方法是使用python list并附加到它,直到它具有所需的大小,然后将其转换为np array

伪代码:

matrix = []
while matrix not full:
    matrix.append(elt)

matrix = np.array(matrix)

答案 1 :(得分:0)

您可以编写一个尝试修改np.array的函数,如果遇到IndexError则展开:

x = np.random.normal(size=(2,2))

r,c = (5,10)

try:
    x[r,c] = val
except IndexError:
    r0,c0 = x.shape
    r_ = r+1-r0
    c_ = c+1-c0
    if r > 0:
        x = np.concatenate([x,np.zeros((r_,x.shape[1]))], axis = 0)
    if c > 0:
        x = np.concatenate([x,np.zeros((x.shape[0],c_))], axis = 1)

但是这个实现存在一些问题:首先,它创建了一个数组的副本并返回它的串联,如果你多次使用它会转换为可能的瓶颈。其次,我提供的代码仅在您修改单个元素时才有效。您可以为切片执行此操作,修改代码需要花费更多精力;或者你可以去整个九码并创建一个继承np.array的新对象并覆盖.__getitem__.__setitem__方法。

或者你可以使用一个巨大的矩阵,或者更好的是,看看你是否可以避免使用未知大小的矩阵。

答案 2 :(得分:0)

如果您有python生成器,可以使用np.fromiter

def gen():
    yield 1
    yield 2
    yield 3

In [11]: np.fromiter(gen(), dtype='int64')
Out[11]: array([1, 2, 3])

请注意,如果你传递一个无限迭代器,你很可能会崩溃python,所以通常最好限制长度(使用count参数):

In [21]: from itertools import count  # an infinite iterator

In [22]: np.fromiter(count(), dtype='int64', count=3)
Out[22]: array([0, 1, 2])

答案 3 :(得分:0)

最佳做法通常是预先分配(如果您知道大小)或首先将array构建为list(使用list.append)。但是列表不能很好地构建在2d中,因为你指定了一个“矩阵”,我认为你想要它。

在这种情况下,我建议预先分配一个超大scipy.sparse矩阵。这些可以定义为比您的内存大得多,lil_matrixdok_matrix可以按顺序构建。然后,您可以在输入所有数据后将其削减。

from scipy.sparse import dok_matrix

dummy = dok_matrix((1000000, 1000000)) # as big as you think you might need
for i, j, data in generator():
    dummy[i,j] = data
s = np.array(dummy.keys).max() + 1
M = dummy.tocoo[:s,:s] #or tocsr, tobsr, toarray . . . 

通过这种方式,您可以将数组构建为Keys of Dictionary(支持动态分配的字典比ndarray更好),但仍然具有类似矩阵的输出,可以(有些)有效地用于数学,甚至处于部分建立状态。