在python

时间:2018-01-25 19:48:52

标签: python python-3.x vector

我的目标是在python中创建下表(namedtuples的2D向量):

     (0,0,1) | (2,0,7) | (1,0,1)
             | (3,0,1) | (4,0,1)
             | (5,0,1) |

可以看出,表格T[0]的大小为1,T[1]的大小为3,T[2]的大小为2。 到目前为止,我看到的所有方法都与使用List Comprehension有关,但是会产生一个固定的MxN矩阵。我很想知道我是否可以使用python首先预先分配第一维的大小(在我的情况下为3),然后继续向每个T[i]添加元素。

在用C ++编写时,我会声明一个大小为3的向量T,并按需动态继续将push_back元素继续到每个维度。但是我无法找到一种优雅的方式来写这个是python。

我是python的新手,我的第一次尝试是执行以下操作(不使用namedtuples):

 T=[]
 arr1=[0,1,2]
 arr2=[3,4]
 arr3=[6,6,7,8]

 T.append(arr1)
 T.append(arr2)
 T.append(arr3)

这导致了以下结果:

  >>T
  [[0, 1, 2], [3, 4], [5, 6, 7, 8]]

但是,如果我清除arr1,它也会从T中删除。有没有更好的方法解决这个问题?

2 个答案:

答案 0 :(得分:2)

arr1追加到T时,您没有制作arr1列表的新副本。您需要先复制列表,然后才能将其附加到T,以便在修改arr1时,您添加到T的列表不会被修改。

为此,请使用T.append(list(arr1))。在将arr1添加到T之前,这将生成attr()的新副本。

答案 1 :(得分:0)

我没有看到一种方法来限制数组的内存消耗仅限于你有条目的单元格,只要你想对整个事情执行数组操作。你可以从numpy那里考虑一个蒙面数组:

import numpy as np
import numpy.ma as ma
arr = ma.array([[0, 1, 2,-999], [3, 4,-999,-999], [5, 6, 7, 8]])
arr[arr==-999] = ma.masked
print arr

[[0 1 2 --]
 [3 4 -- --]
 [5 6 7 8]]

也可以使用元组作为条目:

arr2 = ma.array([
    [(0,0,1), (2,0,7), (1,0,1)],
    [-999, (3,0,1), (4,0,1)],
    [-999, (5,0,1), -999],
], )
arr2[arr2==-999] = ma.masked
print arr2

[[(0, 0, 1) (2, 0, 7) (1, 0, 1)]
 [-- (3, 0, 1) (4, 0, 1)]
 [-- (5, 0, 1) --]]

如果您需要一个内存有效的解决方案(并且不需要向量操作),那么使用列表列表的方法可能是您可以做的最好的方法:

T = [
    [(0,0,1)],
    [(2,0,7), (3,0,1), (5,0,1)],
    [(1,0,1), (4,0,1)],    
]
print T

[[(0, 0, 1)], [(2, 0, 7), (3, 0, 1), (5, 0, 1)], [(1, 0, 1), (4, 0, 1)]]