1.
def
centroide_a(pontos):
2.
"""
3.
Calcula o centróide de um conjunto de pontos n-dimensionais.
4.
Entrada = uma lista de pontos.
5.
Assume a existência de pelo menos um ponto!!
6.
"""
7.
cent
=
[sum(ponto)
/
len(ponto)
for
ponto
in
zip(
*
pontos)]
8.
return
tuple(cent)
Como fizemos? Precisamos somar por componente (coordenada) o valor, nessa componente, de cada ponto. Depois basta dividir pelo número de pontos. Que representação estamos a usar? Uma lista de tuplos. Por exemplo, para o caso a 3 dimensões podíamos ter algo como:
1.
[(x1,y1,z1), (x2,y2,z2), (x3,y3,z3), (x4,y4,z4)]
Para a componente x, por exemplo, teríamos que fazer (x1 + x2 + x3 + x4)/4). Mas como passar da lista de pontos para uma lista em que temos as componentes de cada ponto juntas? Usamos a operação pré-definida zip. Com um detalhe: no argumento colocamos à cabeça o operador *, para que se possa operar correctamente. A diferença entre usar, ou não, * é ilustrada no exemplo seguinte:
1.
>>> ll
=
[(
1
,
2
,
3
), (
4
,
5
,
6
)]
2.
>>> zip(ll)
3.
[((
1
,
2
,
3
),), ((
4
,
5
,
6
),)]
4.
>>> zip(
*
ll)
5.
[(
1
,
4
), (
2
,
5
), (
3
,
6
)]
6.
>>>
Repare-se que ao usar listas por compreensão, o nosso resultado é uma lista. Por isso na instrução return temos que forçar a passagem a tuplo.
Bom dia professor
ResponderEliminarForçar a passagem a tuplo?
Pode dar um exemplo?
cumprimentos
Está no código (linha 8): return TUPLE(cent).
ResponderEliminar