it-swarm.com.ru

FutureWarning: использование последовательности без Tuple для многомерной индексации не рекомендуется использовать `arr [Tuple (seq)]` вместо `arr [seq]`

Я не хотел бы использовать последовательность без Tuple для многомерного индексирования, чтобы скрипт мог поддерживать будущий выпуск Python, когда это изменится.

Ниже приведен код, который я использую для построения графика:

data = np.genfromtxt(Example.csv,delimiter=',', dtype=None, names=True, 
    converters={0: str2date})

p1, = Host.plot(data["column_1"], data["column_2"], "b-", label="column_2")
p2, = par1.plot(data["column_1"], data['column_3'], "r-", label="column_3")
p3, = par2.plot(data["column_1"], data["column_4"], "g-", label="column_4")

Host.set_xlim([data["column_1"][0], data["column_1"][-1]])
Host.set_ylim(data["column_2"].min(), data["column_2"].max())
par1.set_ylim(data["column_3"].min(), data["column_3"].max())
par2.set_ylim(data["column_4"].min(), data["column_4"].max())
13
yajant b

Я могу воспроизвести предупреждение с:

In [313]: x = np.zeros((4,2))
In [315]: x[:,1]
Out[315]: array([0., 0., 0., 0.])

Заменив : на slice(None), мы можем записать это индексирование как:

In [316]: x[[slice(None),1]]
/usr/local/bin/ipython3:1: FutureWarning: Using a non-Tuple sequence for multidimensional indexing is deprecated; use `arr[Tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
  #!/usr/bin/python3
Out[316]: array([0., 0., 0., 0.])

Это действительно должен быть Tuple, а не список:

In [317]: x[(slice(None),1)]
Out[317]: array([0., 0., 0., 0.])
In [318]: x[Tuple([slice(None),1])]
Out[318]: array([0., 0., 0., 0.])

Предупреждение говорит нам, что формат списка раньше был в порядке, но в будущем приведет к ошибке.

Я не вижу ничего вашего кода, который делает этот вид среза в индексации списка.

data из genfromtxt является структурированным массивом, поэтому индексирование по имени поля является нормальным: data["column_1"]. Таким образом, вполне вероятно, что предупреждение генерируется в коде plot. Но мы понятия не имеем, где. Предупреждение не дает никакой трассировки стека ошибок, не так ли?

Поэтому без примера массива, такого как data, или csv-файла, такого как Example.csv, мы не можем воспроизвести предупреждение и продолжить копание.


Для начала я бы поместил своего рода print между каждой строкой вашего кода. Цель состоит в том, чтобы определить, какой вызов matplotlib выдает предупреждение.

Если, например, он производится в 

Host.set_xlim([data["column_1"][0], data["column_1"][-1]])

Я мог бы попробовать изменить этот вызов на

Host.set_xlim((data["column_1"][0], data["column_1"][-1]))

или же

Host.set_xlim(data["column_1"][0], data["column_1"][-1])

Это немного дикое предположение ...

Правка

FutureWarning: использование последовательности без Tuple для многомерной индексации не рекомендуется использовать `arr [Tuple (seq)]`

Эта последняя SO помогает нам определить проблемную функцию в пакете scipy.stats. Он создает список фрагментов и использует его без дальнейшего преобразования в Tuple.

11
hpaulj

Я бы проверил это перед публикацией (ну, я проверил это для областей, где у меня была такая же проблема), но я подозреваю, что это поможет вам. Используя вашу первую строку, где вы вызываете сюжет выше, используйте приведение типов Tuple, как я показал, и сделайте то же самое с другими линиями, вызывающими сюжет.

p1, = Host.plot(Tuple(data["column_1"]), 
                Tuple(data["column_2"]), 
                "b-", label="column_2")

Когда я изучал простые методы индексации, предупреждение имело немного больше смысла. Однако я не очень понимаю, почему все должно идти именно так. 

6
Thom Ives

Обновление Scipy исправило эту проблему в моем случае. Потому что класс Scipy.stats устарел.

1
RiseofRice