【发布时间】:2018-07-08 04:28:08
【问题描述】:
我只是在制作我的 python 程序。下面是我的代码,它会返回:
File "relation.py", line 134, in <module>
k = z1[i][0] = sampling(a[l, :], b[l, :], z1_sum[i], alpha[l, :], k_l)
TypeError: list indices must be integers, not tuple
在我的代码中(如下),我没有定义任何元组。所以我不知道这段代码有什么问题。
import random
import numpy as np
import math
def sampling(a, b, I, alpha, length):
summary = 0
N = len(alpha)
for i in range(N):
A = math.gamma(a[i] + I[i]) * math.gamma(b[i] + length - I[i]) / math.gamma(a[i] + b[i] + I[i])
B = math.gamma(a[i] + b[i]) / (math.gamma(a[i]) * math.gamma(b[i]))
value = alpha[i] * A * B
summary += value
result.append(value)
choose = random.randomrange(summary)
num = N - 1
for i in range(N):
choose -= result[i]
if choose < 0:
num = i
break
return num
def delta(x, y):
if x == y:
return 1
return 0
data = []
print("please input (k, l):")
num = map(int, raw_input().split())
k_l = k = num[0]
l_l = l = num[1]
param_p = [[0 for i in range(k)] for j in range(l)]
param_n = [[0 for i in range(k)] for j in range(l)]
param_k = [0] * k
param_l = [0] * l
count = 1000
print("please input (N1, N2):")
number = map(int, raw_input().split())
N1 = number[0]
N2 = number[1]
random.randint(50, 100)
z1 = []
z2 = []
z1_sum = [2 for i in range(N1)]
z2_sum = [2 for i in range(N2)]
value = 0
alpha = [[2 for i in range(k)] for j in range(l)]
a = np.array([[2 for i in range(k)] for j in range(l)])
b = np.array([[2 for i in range(k)] for j in range(l)])
for i in range(N1):
z1.append([value, i],)
if i % k == k - 1:
value = 0
else:
value += 1
value = 0
for i in range(N2):
z2.append([value, i],)
if i % l == l - 1:
value = 0
else:
value += 1
print(z1)
print(z2)
print("please input relation-data:")
for i in range(N2):
line = map(int, raw_input().split())
data.append(line)
print(data)
param_p[0][0] = -1
print(param_p[1][0])
param_p[0][0] = 0
for i in range(N2):
l = z2[i][0]
for j in range(N1):
k = z1[j][0]
z1_sum[i] += data[i][j]
z2_sum[j] += data[i][j]
param_p[l][k] += data[i][j]
param_n[l][k] += 1 - data[i][j]
param_k[k] += data[i][j]
param_l[l] += data[i][j]
print(param_p)
print(param_n)
print(param_k)
print(param_l)
#sampling(a, b, I, alpha, length)
k = 0
l = 0
for n in range(count):
for i in range(N1):
temp = z1[i][0]
for j in range(l_l):
alpha[j][temp] += param_l[j]
a[j][temp] += param_p[j][temp]
b[j][temp] += param_n[j][temp]
I = delta(z1[i][0], temp)
param_p[j][temp] -= z1_sum[i] * I
param_n[j][temp] -= (k_l - z1_sum[i]) * I
param_l[j] -= I
k = z1[i][0] = sampling(a[l, :], b[l, :], z1_sum[i], alpha[l, :], k_l)
for j in range(l_l):
alpha[j][temp] -= param_l[j]
a[j][temp] -= param_p[j][temp]
b[j][temp] -= param_n[j][temp]
I = delta(z1[i][0], k)
param_p[j][k] += z1_sum[i] * z1_sum[i] * I
param_p[j][k] += (k_l - z1_sum[i]) * z1_sum[i] * I
param_l[j] += z1_sum[i] * I
for i in range(N2):
temp = z2[i][0]
for j in range(k_l):
alpha[temp][j] += param_k[j]
a[temp][j] += param_p[temp][j]
b[temp][j] += param_n[temp][j]
I = delta(z2[i][0], temp)
param_p[temp][j] -= z2_sum[i] * I
param_n[temp][j] -= (l_l - z2_sum[i]) * I
param_k[j] -= I
l = z2[i][0] = sampling(a[:, k], b[:, k], z2_sum[i], alpha[:, k], l_l)
for j in range(k_l):
alpha[temp][j] -= param_k[j]
a[temp][j] -= param_p[temp][j]
b[temp][j] -= param_n[temp][j]
I = delta(z2[i][0], l)
param_p[l][j] += z2_sum[i] * I
param_n[l][j] += (l_l - z2_sum[i]) * I
param_k[j] += I
print("Hello")
print(z1)
print(z2)
如你所见,我只定义了 numpy 并且 a[l, :] 根本不是元组。Ovserving 根本没有 tuple 的业务。这里只有列表元素。为什么 python 返回有关元组的错误。
【问题讨论】:
-
请粘贴整个异常,而不仅仅是描述。 Python 为您提供了大量有用的信息——最重要的是,哪一行有问题——这是调试问题所必需的。
-
无论如何,你的代码中肯定确实有元组,包括作为索引的元组,例如
alpha[l, :]。每当您有用逗号分隔的值时,除了函数调用(或赋值目标)的参数,这就是一个元组。这很好——事实上,你应该有更多个元组;当您使用 2D NumPy 数组时,您应该像a[i, j]一样访问它们,而不是[i][j]。但是somewhere,您使用的是列表而不是数组。这就是问题所在。 -
抱歉,我刚刚编辑了问题
-
但是当我放 print(type(a[l, :])) 它返回“np.array”
-
好的,所以
a是一个数组——但是b和alpha呢,您也在同一行中进行元组索引?
标签: python python-2.7 list numpy tuples