Python 使用numpy数组字典时出现问题(索引错误)

Python 使用numpy数组字典时出现问题(索引错误),python,python-3.x,numpy,dictionary,Python,Python 3.x,Numpy,Dictionary,我试图使用python和numpy从头开始编写Gaussian Naive Bayes,但在创建单词频率表时遇到了一些麻烦 我有一个由N个单词组成的字典,每个单词都有一个与之相关联的numpy数组 例如: freq_table['subject'] -> Vector of ocurrences of this word of length nrows where nrows is the size of the dataset. 因此,对于数据集中的每一行,我将执行以下操作: freq

我试图使用python和numpy从头开始编写Gaussian Naive Bayes,但在创建单词频率表时遇到了一些麻烦

我有一个由N个单词组成的字典,每个单词都有一个与之相关联的numpy数组

例如:

freq_table['subject'] -> Vector of ocurrences of this word of length nrows where nrows is the size of the dataset.
因此,对于数据集中的每一行,我将执行以下操作:
freq_table[WORD][i]+=1

def序列(自身,X):
#创建字典
self.dictionary(X.data[:100])
#类先验概率的计算
self.p_类=self.prior_probs(X.target)
#计算可能性
nrows=len(X.data[:100])
freq=dict.fromkeys(self.\u dict,nrows*[0])
对于文档,目标,zip中的i(X.data[:2],X.target[:2],range(2)):
打印('doc[%d]共%d个“%(i,nrows))
words=预处理(doc)
印刷品(文字)(一)
对于枚举中的j,w(单词):
印刷品(w,j)
#获取由单词w指定的向量
向量=频率[w]
#在第i个位置(观察id)和当前值之和
向量[i]+=1
打印(频率[主题])
输出是

Dictionary length 4606

doc [0] out of 100
43 0
wheres 0
thing 1
subject 2
nntppostinghost 3
racwamumdedu 4
organization 5
university 6
maryland 7
college 8
lines 9
wondering 10
anyone 11
could 12
enlighten 13
sports 14
looked 15
early 16
called 17
bricklin 18
doors 19
really 20
small 21
addition 22
front 23
bumper 24
separate 25
anyone 26
tellme 27
model 28
engine 29
specs 30
years 31
production 32
history 33
whatever 34
funky 35
looking 36
please 37
email 38
thanks 39
brought 40
neighborhood 41
lerxst 42
[43, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
看来我在为字典和向量编制索引时出错了


单词“subject”不应出现43或53次,因为文档/行中预处理单词的长度为43/53。

代码至少有两个错误:

1) 排队

freq = dict.fromkeys(self._dict, nrows * [0])
您可以使用相同的列表初始化
freq
字典中的所有项<代码>nrows*[0]计算一次以创建一个列表,然后将其传递给
dict.fromkeys()
函数。对这一列表的引用被分配给
freq
字典中的所有键。无论选择哪个键,都会获得对同一列表的引用。这是Python中的常见问题

相反,您可以使用字典理解创建具有单独列表的条目:

freq = {key:nrows*[0] for key in self._dict}
2) 您使用
i
作为
vec
的索引变量,但您打算使用
j

vec[j] += 1

使用具有描述性名称的变量有助于避免此类混淆。

代码至少有两个错误:

1) 排队

freq = dict.fromkeys(self._dict, nrows * [0])
您可以使用相同的列表初始化
freq
字典中的所有项<代码>nrows*[0]计算一次以创建一个列表,然后将其传递给
dict.fromkeys()
函数。对这一列表的引用被分配给
freq
字典中的所有键。无论选择哪个键,都会获得对同一列表的引用。这是Python中的常见问题

相反,您可以使用字典理解创建具有单独列表的条目:

freq = {key:nrows*[0] for key in self._dict}
2) 您使用
i
作为
vec
的索引变量,但您打算使用
j

vec[j] += 1

使用带有描述性名称的变量将有助于避免这种混淆。

这里什么是
X.data
X.target
呢?这里什么是
X.data
X.target
呢?谢谢,Craig我的问题是初始化,实际上键引用的是同一个列表。谢谢Craig我的问题是初始化,实际上键引用的是同一个列表。结果表明,i是正确的。