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]