如何在Python中创建二维数组?
这是我正在尝试创建二维矩阵的代码
m=4
tagProb=[[]]*(m+1)
count=0
index=0
for line in lines:
print(line)
if(count < m+1):
tagProb[index].append(line.split('@@')[2].strip())
count+=1
if(count == m+1): // this check to goto next index
count = 0
index+=1
print(tagProb)
我得到了输出
[['0.0', '0.6', '0.05', '0.3', '0.05', '0.1', '0.0', '0.6', '0.0', '0.0', '0.1', '0.0', '0.0', '0.9', '0.0', '0.1', '0.0', '0.2', '0.7', '0.0', '0.1', '0.0', '0.9', '0.0', 0.0'], ['0.0', '0.6', '0.05', '0.3', '0.05', '0.1', '0.0', '0.6', '0.0', '0.0', '0.1', '0.0', .0', '0.9', '0.0', '0.1', '0.0', '0.2', '0.7', '0.0', '0.1', '0.0', '0.9', '0.0', '0.0'], '0.0', '0.6', '0.05', '0.3', '0.05', '0.1', '0.0', '0.6', '0.0', '0.0', '0.1', '0.0', '0.0','0.9', '0.0', '0.1', '0.0', '0.2', '0.7', '0.0', '0.1', '0.0', '0.9', '0.0', '0.0'] ]
所有的值都被添加在一起,列表里的值都是一样的。 我该如何避免这种情况呢?
3 个回答
在编程中,有时候我们会遇到一些问题,可能是因为代码写得不够好,或者是我们对某些概念理解得不够透彻。比如,有人可能在使用某个库或者框架的时候,遇到了错误或者不明白的地方。这种情况下,查看其他人的提问和回答就很有帮助。
在StackOverflow上,很多人会分享他们遇到的问题和解决方案。通过这些讨论,我们可以学到很多东西,尤其是如何解决类似的问题。即使是初学者,也能从中找到灵感,帮助自己更好地理解编程的世界。
总之,遇到问题时,不要害怕去寻求帮助,看看别人是怎么解决的,这样可以让你在编程的路上走得更顺利。
m=4
tagProb=[]
count=0
index=0
innerlist = []
for line in lines:
print(line)
if(count < m+1):
innerlist.append(line.split('@@')[2].strip())
count+=1
if(count == m+1): // this check to goto next index
count = 0
index+=1
tagProb.append(innerlist)
innerlist = []
print(tagProb)
一次创建一个列表并插入它们:
import copy
m=4
tagProb=[]
count=0
index=0
for line in lines:
print(line)
innerlist = []
if(count < m+1):
innerlist.append(line.split('@@')[2].strip())
count+=1
if(count == m+1): // this check to goto next index
count = 0
index+=1
tagProb.append(copy.deepcopy(innerlist))
innerlist = []
print(tagProb)
你可以看到,有一个叫做 innerlist
的列表,它会被不断添加内容。然后对于每一行数据,它会把这个列表添加到一个包含多个列表的大列表中。(不过你可能需要做一个列表的复制,以防止数据混乱)。
你在列表上使用了 *
,这有个小问题——它会生成很多指向同一个对象的引用。对于像 int
或 tuple
这样的不可变对象,这没问题,但对于像 list
这样的可变对象就不行了,因为改变其中一个对象会导致所有的对象都改变。看看这个:
>>> foo = [[]]*10
>>> foo[0].append(1)
>>> foo
[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
如果你不想发生这种情况,通常的解决办法是使用列表推导式,这样可以用新的对象来初始化列表:
>>> bar = [[] for _ in range(10)]
>>> bar[0].append(1)
>>> bar
[[1], [], [], [], [], [], [], [], [], []]
不过,这个问题在标准的 Python 代码中并不常见,因为初始化一个大列表并不是常见的做法——这更像是 C 语言的思维方式。(这并不是说有时候这样做不对——Python 是多范式的!)
另外,你的代码写得不太好。Python 中的 for
循环是为了方便遍历对象而设计的,这样你就不需要手动管理索引变量(你代码中的 index
和 count
)。可以把它改写成这样:
import numpy as np
m = 4
tagProb = np.array(list(line.split("@@")[2].strip() for line in lines)))
tagProb = tagProb.reshape((m+1,-1)).T
解释一下:第一行定义了 tagProb
为一个一维的 numpy 数组(这是一种基于 C 的快速数组类型,具有很多线性代数函数),里面的值都是一排的。第二行把它转换成一个高度为 m+1
的矩阵,并推断宽度(注意,矩阵必须是方形的才能这样做;如果需要,可以用 None
来填充),然后再转置。我相信这就是你迭代的目的,但有点难以理解——如果你需要帮助,随时告诉我。