在python中创建非统一的二维向量
我的目标是在python中创建下表(namedtuples的2D向量):在python中创建非统一的二维向量,python,python-3.x,vector,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。 到目前为止,我看到的所有方法都与使用列表理解有关,但这会导致固定的MxN矩阵。我很想知道是否可以使用python先预先分配第一个维度的大小(在我的例子3中),然后继续向
(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。
到目前为止,我看到的所有方法都与使用列表理解有关,但这会导致固定的MxN矩阵。我很想知道是否可以使用python先预先分配第一个维度的大小(在我的例子3中),然后继续向每个T[I]
添加元素
在C++中编写时,我声明一个大小为3的向量T,并且以动态的方式继续将推送元素返回到每个维度。然而,我无法找到一种优雅的方式来编写这篇文章,这就是python
我对python非常陌生,我的第一次尝试是执行以下操作(不使用namedtuples): 这导致了以下结果: >>T
[[0, 1, 2], [3, 4], [5, 6, 7, 8]]
但是,如果我清除了
arr1
,它也将从T
中删除。有更好的方法解决这个问题吗?当您将arr1
附加到T
时,您并不是在制作arr1
列表的新副本。在将列表附加到T
之前,您需要制作一份该列表的副本,以便在修改arr1
时,添加到T
的列表不会被修改
为此,请使用
T.append(list(arr1))
。这将在将arr1
添加到T
之前创建一个新的副本。我看不到一种方法可以将数组的内存消耗仅限制在有条目的单元格中,只要您想对整件事执行数组操作。您可以从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)]]
与C++中的比较,不证明C++标签是正确的。你能解释一下你是如何从你期望的输入到你想要的输出吗?我不理解你提供的代码与你在顶部显示的表之间的关系。@ Pult请将表视为单个元素(而不是3个int的命名元组)。代码只是问题的简单表示,其中向量的每个维度的大小都不同。我希望这有帮助,我明白了。回到你原来的问题。范围(3)内的[code>T=[]有什么问题?顺便说一句,
arr1
没有从T
中删除,它仍然在那里,只是空的。@PaulPanzer非常感谢!!这正是我想要的。
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)]]