unir - ¿Cómo puedo evitar que los índices TypeError: list deben ser enteros, no tuplas cuando se copia una lista de python en una matriz numpy?
unir matrices en python (5)
La variable mean_data
es una lista anidada, en Python, el acceso a una lista anidada no se puede realizar mediante rebanadas multidimensionales, es decir: mean_data[1,2]
, en cambio, se escribiría mean_data[1][2]
.
Esto se debe a que mean_data[2]
es una lista. La indexación adicional se realiza de forma recursiva, ya que mean_data[2]
es una lista, mean_data[2][0]
es el primer índice de esa lista.
Además, mean_data[:][0]
no funciona porque mean_data[:]
devuelve mean_data
.
La solución es reemplazar la matriz o importar los datos originales de la siguiente manera:
mean_data = np.array(mean_data)
las matrices numpy (como las matrices MATLAB y, a diferencia de las listas anidadas) admiten el corte multidimensional con tuplas.
Estoy tratando de crear 3 arrays / listas numpy usando datos de otra matriz llamada mean_data de la siguiente manera:
---> 39 R = np.array(mean_data[:,0])
40 P = np.array(mean_data[:,1])
41 Z = np.array(mean_data[:,2])
Cuando intento ejecutar el programa me sale el error:
TypeError: list indices must be integers, not tuple
La lista de mean_data se parece a esta muestra ...
[6.0, 315.0, 4.8123788544375692e-06],
[6.5, 0.0, 2.259217450023793e-06],
[6.5, 45.0, 9.2823565008402673e-06],
[6.5, 90.0, 8.309270169336028e-06],
[6.5, 135.0, 6.4709418114245381e-05],
[6.5, 180.0, 1.7227922423558414e-05],
[6.5, 225.0, 1.2308522579848724e-05],
[6.5, 270.0, 2.6905672894824344e-05],
[6.5, 315.0, 2.2727114437176048e-05]]
No sé cómo evitar este error, he intentado crear mean_data como np.array y usar np.append para agregarle valores, pero eso tampoco resuelve el problema.
Aquí está el rastreo (estaba usando ipython antes)
Traceback (most recent call last):
File "polarplot.py", line 36, in <module>
R = np.array(mean_data[:,0])
TypeError: list indices must be integers, not tuple
Y la otra forma en que intenté crear una matriz fue:
mean_data = np.array([])
for ur, ua in it.product(uradius, uangle):
samepoints = (data[:,0]==ur) & (data[:,1]==ua)
if samepoints.sum() > 1: # check if there is more than one match
np.append(mean_data[ur, ua, np.mean(data[samepoints,-1])])
elif samepoints.sum() == 1:
np.append(mean_data, [ur, ua, data[samepoints,-1]])
La traza en eso es:
IndexError Traceback (most recent call last)
<ipython-input-3-5268bc25e75e> in <module>()
31 samepoints = (data[:,0]==ur) & (data[:,1]==ua)
32 if samepoints.sum() > 1: # check if there is more than one match
---> 33 np.append(mean_data[ur, ua, np.mean(data[samepoints,-1])])
34 elif samepoints.sum() == 1:
35 np.append(mean_data, [ur, ua, data[samepoints,-1]])
IndexError: invalid index
Probablemente no necesite estar haciendo listas y adjuntándolas para hacer su matriz. Es probable que solo puedas hacerlo todo a la vez, lo cual es más rápido, ya que puedes usar numpy para hacer tus bucles en lugar de hacerlo tú mismo en python puro.
Para responder a su pregunta, como han dicho otros, no puede acceder a una lista anidada con dos índices como lo hizo. Puede mean_data
si convierte mean_data
a una matriz antes de no intentar mean_data
:
R = np.array(mean_data)[:,0]
en lugar de
R = np.array(mean_data[:,0])
Pero, asumiendo que mean_data tiene una forma nx3
, en lugar de
R = np.array(mean_data)[:,0]
P = np.array(mean_data)[:,1]
Z = np.array(mean_data)[:,2]
Simplemente puedes hacer
A = np.array(mean_data).mean(axis=0)
que promedia sobre el eje 0
y devuelve una matriz length- n
Pero para mi punto original, inventaré algunos datos para tratar de ilustrar cómo se puede hacer esto sin construir ninguna lista de un elemento a la vez:
Solo si alguien tiene este problema y no ha hecho la list[index, sub-index]
, podría tener el problema porque le falta una coma entre las matrices en una matriz de matrices (me pasó a mí).
np.append necesita la matriz como primer argumento y la lista que desea agregar como segundo:
mean_data = np.append(mean_data, [ur, ua, np.mean(data[samepoints,-1])])
import numpy as np
mean_data = np.array([
[6.0, 315.0, 4.8123788544375692e-06],
[6.5, 0.0, 2.259217450023793e-06],
[6.5, 45.0, 9.2823565008402673e-06],
[6.5, 90.0, 8.309270169336028e-06],
[6.5, 135.0, 6.4709418114245381e-05],
[6.5, 180.0, 1.7227922423558414e-05],
[6.5, 225.0, 1.2308522579848724e-05],
[6.5, 270.0, 2.6905672894824344e-05],
[6.5, 315.0, 2.2727114437176048e-05]])
R = mean_data[:,0]
print R
print R.shape
EDITAR
La razón por la que tuvo un error de invalid index
es la falta de una coma entre mean_data
y los valores que desea agregar.
Además, np.append devuelve una copia de la matriz y no cambia la matriz original. De la documentación:
Devoluciones: anexar: ndarray
Una copia de arr con valores anexados al eje. Tenga en cuenta que el anexo no se produce in situ: se asigna y se llena una nueva matriz. Si el eje es Ninguno, la salida es una matriz aplanada.
Por lo tanto, debe asignar el resultado np.append
a una matriz (podría ser mean_data
, creo), y , como no desea una matriz aplanada, también debe especificar el eje al que desea anexar.
Con eso en mente, creo que podrías intentar algo como
mean_data = np.append(mean_data, [[ur, ua, np.mean(data[samepoints,-1])]], axis=0)
Eche un vistazo a la doble [[
y ]]
: creo que son necesarias ya que ambas matrices deben tener la misma forma.