Тип возврата np.nditer для ссылочных типов - PullRequest
0 голосов
/ 13 сентября 2018

Как я могу получить правильный тип возврата для np.nditer?Мне нужно перебрать объект ax здесь:

fig, ax = plt.subplots(figsize=(16,9), ncols=3, nrows=2)
for col, elem in zip(df.columns[:-1], np.nditer(ax, flags = ['refs_ok'])):
    sns.countplot(x="CLASS", hue=col, data=df, ax=elem)

Я знаю, что мог бы перебрать здесь, используя размерность массива ax, но мне интересно, смогу ли я сделать эту работу.По сути, ax=elem должен выглядеть как ax=ax[i][j] в итерации.Но оказывается, что они бывают разных типов:

print(type(elem))
print(type(ax[0][0]))

возвращает:

<class 'numpy.ndarray'>
<class 'matplotlib.axes._subplots.AxesSubplot'>

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Возможно, вы хотите выполнить итерацию, как

fig, ax = plt.subplots(figsize=(16,9), ncols=3, nrows=2)
for col, elem in zip(df.columns[:-1], ax.flat):
    sns.countplot(x="CLASS", hue=col, data=df, ax=elem)

, которая короче и всегда делает elem matplotlib.axes._subplots.AxesSubplot объектом.

0 голосов
/ 13 сентября 2018

Проблема с использованием функции numpy, подобной этой, заключается в том, что она сразу преобразует итерируемое в объект np.ndarray.

Следовательно, ваше возвращаемое значение будет частью этой np.ndarrayвзгляните на следующий пример

In [472]: list(np.nditer([[None, None], [None, None]], flags = ['refs_ok']))
Out[472]:
[(array(None, dtype=object), array(None, dtype=object)),
 (array(None, dtype=object), array(None, dtype=object))]

In [473]: list(np.nditer([[None, None], [None, None]], flags = ['refs_ok']))[0][0]
Out[473]: array(None, dtype=object)

Если вы хотите получить необработанный элемент из массива 0 100 * *, используйте метод .tolist()

.помните, что, поскольку вы не выполняете итерации числовых типов, нет смысла вводить всю эту сложность numpy и накладные расходы, правильный способ сделать это - https://stackoverflow.com/a/52316861/4013571

...