如何在Python中创建二维数组?

2 投票
3 回答
4796 浏览
提问于 2025-04-16 04:59

这是我正在尝试创建二维矩阵的代码

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 个回答

0

在编程中,有时候我们会遇到一些问题,可能是因为代码写得不够好,或者是我们对某些概念理解得不够透彻。比如,有人可能在使用某个库或者框架的时候,遇到了错误或者不明白的地方。这种情况下,查看其他人的提问和回答就很有帮助。

在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) 
1

一次创建一个列表并插入它们:

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 的列表,它会被不断添加内容。然后对于每一行数据,它会把这个列表添加到一个包含多个列表的大列表中。(不过你可能需要做一个列表的复制,以防止数据混乱)。

10

你在列表上使用了 *,这有个小问题——它会生成很多指向同一个对象的引用。对于像 inttuple 这样的不可变对象,这没问题,但对于像 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 循环是为了方便遍历对象而设计的,这样你就不需要手动管理索引变量(你代码中的 indexcount)。可以把它改写成这样:

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 来填充),然后再转置。我相信这就是你迭代的目的,但有点难以理解——如果你需要帮助,随时告诉我。

撰写回答