我想在我的Python代码中使用矩阵,但我不知道我的矩阵的确切大小来定义它。
对于其他矩阵,我使用了np.zeros(a)
,其中a
已知。
如何定义未知大小的矩阵?
答案 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_matrix
或dok_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
更好),但仍然具有类似矩阵的输出,可以(有些)有效地用于数学,甚至处于部分建立状态。