我是python的新手,在查找元组元组的最小值和最大值时遇到一些问题。我需要它们来规范我的数据。所以,基本上,我有一个包含13个数字的列表,每个数字代表一些东西。每个数字都会在列表中生成一列,每列需要max
和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)
答案 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)