Разница между `nditer` и` flat`, типом элемента - PullRequest
0 голосов
/ 09 апреля 2020

Я создал дочерние участки и хотел изменить xlim для каждого из участков. Для этого я написал следующий код:

import numpy as np
import matplotlib.pyplot as plt

fig, axs = plt.subplots(2, 3, figsize=(20, 10))

for ax in np.nditer(axs, flags=['refs_ok']):
    ax.set_xlim(left=0.0, right=0.5)

Но я получаю следующую ошибку:

AttributeError: 'numpy.ndarray' object has no attribute 'set_xlim'

Я провел немного больше исследований и в итоге использовал flat для достичь того, что я хотел в первую очередь. Но я не понимаю, почему nditer не работает так, как я ожидал. Чтобы проиллюстрировать это, следующий код:

import numpy as np
import matplotlib.pyplot as plt

fig, axs = plt.subplots(2, 3, figsize=(20, 10))

print("Using flat")
for ax in axs.flat:
    print(ax, type(ax))

print("Using nditer")
for ax in np.nditer(axs, flags=['refs_ok']):
    print(ax, type(ax))

дает такие результаты:

Using flat
AxesSubplot(0.125,0.536818;0.227941x0.343182) <class 'matplotlib.axes._subplots.AxesSubplot'>
AxesSubplot(0.398529,0.536818;0.227941x0.343182) <class 'matplotlib.axes._subplots.AxesSubplot'>
AxesSubplot(0.672059,0.536818;0.227941x0.343182) <class 'matplotlib.axes._subplots.AxesSubplot'>
AxesSubplot(0.125,0.125;0.227941x0.343182) <class 'matplotlib.axes._subplots.AxesSubplot'>
AxesSubplot(0.398529,0.125;0.227941x0.343182) <class 'matplotlib.axes._subplots.AxesSubplot'>
AxesSubplot(0.672059,0.125;0.227941x0.343182) <class 'matplotlib.axes._subplots.AxesSubplot'>

Using nditer
AxesSubplot(0.125,0.536818;0.227941x0.343182) <class 'numpy.ndarray'>
AxesSubplot(0.398529,0.536818;0.227941x0.343182) <class 'numpy.ndarray'>
AxesSubplot(0.672059,0.536818;0.227941x0.343182) <class 'numpy.ndarray'>
AxesSubplot(0.125,0.125;0.227941x0.343182) <class 'numpy.ndarray'>
AxesSubplot(0.398529,0.125;0.227941x0.343182) <class 'numpy.ndarray'>
AxesSubplot(0.672059,0.125;0.227941x0.343182) <class 'numpy.ndarray'>

Как я понимаю, plt.subplots возвращает двумерный массив, и предпочтительным методом итерации по его элементам является nditer (https://docs.scipy.org/doc/numpy/reference/arrays.nditer.html). Почему тогда это не работает в этом случае, и элемент, который я перебираю, имеет тип <class 'numpy.ndarray'>, а не <class 'matplotlib.axes._subplots.AxesSubplot'>?

1 Ответ

1 голос
/ 09 апреля 2020

Итерация по массиву с nditer дает вам представления о ячейках исходного массива в виде 0-мерных массивов. Для необъектных массивов это почти эквивалентно созданию скаляров, поскольку 0-мерные массивы обычно ведут себя как скаляры, но это не работает для объектных массивов.

Итерация по массиву объектов с flat просто дает вам объекты напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...