Как обратиться к предупреждающему сообщению numpy о стекировании массивов?

#python #numpy

#питон #тупица

Вопрос:

Я видел, как сообщение об устаревании numpy «Предупреждение о будущем: массивы для стека должны передаваться как тип «последовательности», такой как список или кортеж», появляется в различных потоках, но я не вижу наиболее простого способа решения этой проблемы для моей простой ситуации с трехмерным массивом:

 import numpy as np X=np.random.rand(3,4,5) Y= np.vstack(X[:, :, x].T for x in range(1,3)) # vertically stack X[:,:,0], X[:,:,1], etc.  

В результате появляется сообщение об ошибке

Предупреждение (из модуля предупреждений): Файл «lt;pyshell#2gt;», строка 1 Предупреждение о будущем: массивы для стека должны передаваться как тип «последовательности», такой как список или кортеж. Поддержка итераций, не связанных с последовательностью, таких как генераторы, устарела с NumPy 1.16 и в будущем приведет к ошибке.

Комментарии:

1. Y= np.vstack([X[:, :, x].T for x in range(1,3)]) Так же, как говорит Уоринг arrays to stack must be passed as a "sequence" type such as list or tuple , передайте их в виде списка.

Ответ №1:

Расширяя комментарий.

Если я определю простую функцию:

 def foo(x):  return x  

и назови это так, как ты это сделал vstack :

 In [53]: foo(x[:,0] for x in np.ones((2,3,3))) Out[53]: lt;generator object lt;genexprgt; at 0x7fc5d961bc10gt;  

for Выражение создало генератор. Мы должны завернуть его, list чтобы получить реальный список:

 In [54]: list(_) Out[54]: [array([1., 1., 1.]), array([1., 1., 1.])]  

Добавление [] в ваше выражение создает список:

 In [55]: foo([x[:,0] for x in np.ones((2,3,3))]) Out[55]: [array([1., 1., 1.]), array([1., 1., 1.])]  

Другой синтаксис для создания генератора по сравнению со списком:

 In [56]: (x[:,0] for x in np.ones((2,3,3))) Out[56]: lt;generator object lt;genexprgt; at 0x7fc5d02a1190gt; In [57]: [x[:,0] for x in np.ones((2,3,3))] Out[57]: [array([1., 1., 1.]), array([1., 1., 1.])]  

Код для подобных функций vstack был написан таким образом, чтобы работать с генераторами, но разработчики работают над устранением подобных деталей, делая вещи более последовательными.