#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
был написан таким образом, чтобы работать с генераторами, но разработчики работают над устранением подобных деталей, делая вещи более последовательными.