查找元组元组中的最大值和最小值

时间:2012-10-29 11:33:52

标签: python tuples normalization

我是python的新手,在查找元组元组的最小值和最大值时遇到一些问题。我需要它们来规范我的数据。所以,基本上,我有一个包含13个数字的列表,每个数字代表一些东西。每个数字都会在列表中生成一列,每列需要maxmin。我尝试索引/迭代但不断收到错误

max_j = max(j)

TypeError: 'float' object is not iterable

任何帮助将不胜感激!

代码是(假设data_set_tup是元组的元组,例如((1,3,4,5,6,7,...),(5,6,7,3,6,73,2。 ..)...(3,4,5,6,3,2,2 ...))我还想使用标准化值创建一个新列表。

normal_list = []

for i in data_set_tup:

    for j in i[1:]: # first column doesn't need to be normalised
        max_j = max(j)
        min_j = min(j)
        normal_j = (j-min_j)/(max_j-min_j)
        normal_list.append(normal_j)
    normal_tup = tuple(normal_list)

3 个答案:

答案 0 :(得分:4)

您可以使用zip(*...)将行转置为列,反之亦然。 (在Python 3中使用list(zip(*...))

cols = zip(*data_set_tup)
normal_cols = [cols[0]] # first column doesn't need to be normalised
for j in cols[1:]:
    max_j = max(j)
    min_j = min(j)
    normal_cols.append(tuple((k-min_j)/(max_j-min_j) for k in j)

normal_list = zip(*normal_cols)

答案 1 :(得分:0)

这听起来像是非内置numpy模块或pandas模块的工作,具体取决于您的需求。

不应该轻易地为应用程序添加额外的依赖性,但是如果你在类似矩阵的数据上做了很多工作,那么如果你在整个过程中使用上述模块之一,你的代码可能会更快,更可读你的申请。

我不建议将列表列表转换为numpy数组,然后再返回以获得此单个结果 - 最好使用Jannes答案的纯python方法。此外,看到你是一个蟒蛇初学者,numpy现在可能是矫枉过正。但我认为你的问题值得一个答案,指出这个一个选项。

这是一个循序渐进的控制台说明,它将如何在numpy中起作用:

>>> import numpy as np
>>> a = np.array([[1,3,4,5,6],[5,6,7,3,6],[3,4,5,6,3]], dtype=float)
>>> a
array([[ 1.,  3.,  4.,  5.,  6.],
       [ 5.,  6.,  7.,  3.,  6.],
       [ 3.,  4.,  5.,  6.,  3.]])
>>> min = np.min(a, axis=0)
>>> min
array([1, 3, 4, 3, 3])
>>> max = np.max(a, axis=0)
>>> max
array([5, 6, 7, 6, 6])
>>> normalized = (a - min) / (max - min) 
>>> normalized
array([[ 0.        ,  0.        ,  0.        ,  0.66666667,  1.        ],
       [ 1.        ,  1.        ,  1.        ,  0.        ,  1.        ],
       [ 0.5       ,  0.33333333,  0.33333333,  1.        ,  0.        ]])

所以在实际代码中:

import numpy as np

def normalize_by_column(a):
    min = np.min(a, axis=0)
    max = np.max(a, axis=0)
    return (a - min) / (max - min)

答案 2 :(得分:0)

我们有nested_tuple = ((1, 2, 3), (4, 5, 6), (7, 8, 9))。 首先,我们需要将其标准化。 Pythonic方式:

flat_tuple = [x for row in nested_tuple for x in row]

输出:[1,2,3,4,5,6,7,8,9] # it's a list

将其移至元组:tuple(flat_tuple),获取最大值:max(flat_tuple),获取最小值:min(flat_tuple)