3

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

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)
4

3 回答 3

4

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

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)
于 2012-10-29T11:44:25.173 回答
0

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

在应用程序中添加额外的依赖项不应轻易完成,但如果您对类似矩阵的数据做了大量工作,那么如果您在整个应用程序中使用上述模块之一,您的代码可能会更快、更易读。

我不建议将列表列表转换为 numpy 数组并再次返回以获得这个单一结果——最好使用 Jannes 答案的纯 python 方法。另外,鉴于您是 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)
于 2012-10-29T12:45:22.767 回答
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: tuple(flat_tuple),获取最大值:max(flat_tuple),获取最小值:min(flat_tuple)

于 2015-05-20T09:36:55.963 回答