Python Can';t迭代二维数组以规范化数据
我正在尝试规范化我的数据,我需要迭代训练和测试集。我尝试了不同的方法,但我得到了这个错误Python Can';t迭代二维数组以规范化数据,python,Python,我正在尝试规范化我的数据,我需要迭代训练和测试集。我尝试了不同的方法,但我得到了这个错误列表索引必须是整数或片,而不是列表。我试着把range()和len()放进去,但还是出现了同样的错误 代码: 您正在使用列表作为索引。您可能需要使用enumerate。这将修复您的错误: def minMaxNrom(training_data, testing_data): for indi, i in enumerate(training_data): for indj, j in
列表索引必须是整数或片,而不是列表
。我试着把range()
和len()
放进去,但还是出现了同样的错误
代码:
您正在使用列表作为索引。您可能需要使用enumerate。这将修复您的错误:
def minMaxNrom(training_data, testing_data):
for indi, i in enumerate(training_data):
for indj, j in enumerate(training_data):
new_data = training_data[indi][indj] - min(j) / max(j) - min(j)
for indi, i in enumerate(testing_data):
for indj, j in enumerate(testing_data):
new_testing_data = testing_data[indi][indj] - min(j) / max(j) - min(j)
return (new_data, new_testing_data)
有些人猜测你在努力实现什么
如果没有更多信息,在修复了无法使用列表作为索引的问题后,很难知道代码失败的原因,但我猜:
def minMaxNrom(training_data, testing_data):
new_data = []
new_testing_data = []
for indi, i in enumerate(training_data):
for indj, j in enumerate(training_data):
new_data.append((training_data[indi][indj] - min(j)) / (max(j) - min(j)))
for indi, i in enumerate(testing_data):
for indj, j in enumerate(testing_data):
new_testing_data.append((testing_data[indi][indj] - min(j)) / (max(j) - min(j)))
return (new_data, new_testing_data)
解释
假设你有:
training_data = [[1, 2], [3, 4, 5], [4, 4, 4]]
for i in training_data:
print(i)
这将打印:
[1, 2]
[3, 4, 5]
[4, 4, 4]
如您所见,这里的i
是每个子列表。但要使用引用访问这些子列表,请执行以下操作:
print(training_data[0]) # gives first sublist
print('---')
print(training_data[1]) # gives second sublist
print('---')
print(training_data[2]) # gives third sublist
这将提供:
[1, 2]
---
[3, 4, 5]
---
[4, 4, 4]
请注意,为了访问这些子列表,我们使用了一个数字作为索引,而不是一个列表(这正是您所使用的)。因此,为了访问每个列表并获取其索引,我们使用enumerate(对于i
来说,更好的变量名是子列表
):
这使得:
indi: 0
i: [1, 2]
training_data[indi]: [1, 2]
---
indi: 1
i: [3, 4, 5]
training_data[indi]: [3, 4, 5]
---
indi: 2
i: [4, 4, 4]
training_data[indi]: [4, 4, 4]
为什么不直接使用sklearn.preprocessing
@dexter的MinMaxScaler呢?这是一所大学,所以他们不允许我们使用库,让我们自己编写代码。@TomKarzes我试过了,我也遇到了一个错误。我也试过使用len
,但还是出现了一个错误,这就是为什么我感到困惑。@Stefan哪个大学不允许学生使用库?@dexter我想他们想让我们了解库/code背后的工作原理。我能问一下你为什么要使用indi,I
和indj,j
而不是只有一个?更新答案以回答评论。感谢您的精彩解释。我现在想问为什么我的索引超出了范围?你是说使用整数索引后出现了新的错误吗?如果training\u data
(或testing\u data
)为空,即testing\u data=[]
,则函数可能会失败。函数可能失败的另一种方式是如果子列表为空,即测试_data=[[1,2,3],[3,4],][]
(注意第三个空子列表)。对于空列表,您的max()
和min()
函数将失败。对于空列表,您可以将默认值设置为max()
和min()
。函数失败的原因是什么?进一步更新。
for indi, i in enumerate(training_data):
print('indi: ', indi)
print('i: ', i)
print('training_data[indi]: ', training_data[indi])
print('---')
indi: 0
i: [1, 2]
training_data[indi]: [1, 2]
---
indi: 1
i: [3, 4, 5]
training_data[indi]: [3, 4, 5]
---
indi: 2
i: [4, 4, 4]
training_data[indi]: [4, 4, 4]