Как я могу предотвратить индексы TypeError: list должны быть целыми, а не кортежем при копировании списка python в массив numpy? - программирование
Подтвердить что ты не робот

Как я могу предотвратить индексы TypeError: list должны быть целыми, а не кортежем при копировании списка python в массив numpy?

Я пытаюсь создать 3 numpy массивы/списки, используя данные из другого массива под названием mean_data следующим образом:

---> 39 R = np.array(mean_data[:,0])
     40 P = np.array(mean_data[:,1])
     41 Z = np.array(mean_data[:,2])

Когда я пытаюсь запустить программу, я получаю сообщение об ошибке:

TypeError: list indices must be integers, not tuple

Список средних_данных выглядит как этот образец...

[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]]

Я не знаю, как предотвратить эту ошибку, я попытался создать mean_data как np.array и использовать np.append для добавления к нему значений, но это также не решает проблему.

Здесь traceback (раньше использовал ipython)

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

И другим способом, который я пытался создать массив, было следующее:

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

Отслеживание:

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

Ответ 1

Вам, вероятно, не нужно создавать списки и добавлять их для создания своего массива. Вы можете просто сделать все сразу, что быстрее, поскольку вы можете использовать numpy для выполнения своих циклов вместо того, чтобы делать их сами в чистом питоне.

Чтобы ответить на ваш вопрос, как говорили другие, вы не можете получить доступ к вложенному списку с двумя индексами, как вы. Вы можете, если вы конвертируете mean_data в массив до того, как не попытаетесь его отрезать:

R = np.array(mean_data)[:,0]

вместо

R = np.array(mean_data[:,0])

Но если предположить, что mean_data имеет форму nx3 вместо

R = np.array(mean_data)[:,0]
P = np.array(mean_data)[:,1]
Z = np.array(mean_data)[:,2]

Вы можете просто сделать

A = np.array(mean_data).mean(axis=0)

который усредняет по оси 0 th и возвращает массив длины n

Но, к моему исходному моменту, я сделаю некоторые данные, чтобы попытаться проиллюстрировать, как вы можете это сделать, не создавая ни одного списка по одному элементу за раз:

Ответ 2

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

ИЗМЕНИТЬ

Причиной возникновения ошибки invalid index является отсутствие запятой между mean_data и значениями, которые вы хотели добавить.

Кроме того, np.append возвращает копию массива и не меняет исходный массив. Из документации:

Возвращает: append: ndarray

Копия arr с значениями, добавленными к оси. Обратите внимание, что append не возникает на месте: новый массив распределяется и заполняется. Если ось None, out - сплющенный массив.

Итак, вы должны назначить результат np.append массиву (может быть, сам mean_data), и, так как вам не нужен сплющенный массив, вы также должны укажите ось, к которой вы хотите добавить.

С учетом этого, я думаю, вы могли бы попробовать что-то вроде

mean_data = np.append(mean_data, [[ur, ua, np.mean(data[samepoints,-1])]], axis=0)

Посмотрите на удвоенные [[ и ]]: я думаю, они необходимы, поскольку оба массива должны иметь одинаковую форму.

Ответ 3

Переменная mean_data является вложенным списком, в Python доступ к вложенному списку не может быть выполнен многомерной нарезкой, т.е.: mean_data[1,2], вместо этого следует написать mean_data[1][2].

Это потому, что mean_data[2] - это список. Дальнейшая индексация выполняется рекурсивно - поскольку mean_data[2] - это список, mean_data[2][0] - это первый индекс этого списка.

Кроме того, mean_data[:][0] не работает, потому что mean_data[:] возвращает mean_data.

Решение состоит в том, чтобы заменить массив или импортировать исходные данные следующим образом:

mean_data = np.array(mean_data)

массивы numpy (например, массивы MATLAB и в отличие от вложенных списков) поддерживают многомерную нарезку с кортежами.

Ответ 4

np.append нуждается в массиве как первом аргументе и списке, который вы хотите добавить в качестве второго:

mean_data = np.append(mean_data, [ur, ua, np.mean(data[samepoints,-1])])