Поэтому я пытаюсь выяснить, есть ли способ сделать это похожим на цикл for внутри np.array. Простой пример приведен ниже.
Нормальный метод:
>>> np.array([
... (x, x + 2)
... for x in range(10)
... if x%2 == 0])
array([[ 0, 2],
[ 2, 4],
[ 4, 6],
[ 6, 8],
[ 8, 10]])
Результат, которого я хотел бы достичь, будет:
array([[np.nan, np.nan],
[ 0, 2],
[ 2, 4],
[ 4, 6],
[ 6, 8],
[ 8, 10]])
То, что я пытался без успеха:
>>> np.array([
... (np.nan, np.nan),
... (x, x+2)
... for x in range(10)
... if x%2 == 0])
Также как и:
>>> np.array(
... [np.nan, np.nan],
... [(x, x+2)
... for x in range(10)
... if x%2 == 0])
Я хотел бы сделать это без объединения hstack.
Любая помощь очень ценится.
2 ответа
Обновить , чтобы соответствовать обновленному Q.
>>> np.array([[np.nan, np.nan], *[(x, x+2) for x in range(10) if x%2 ==0]])
array([[nan, nan],
[ 0., 2.],
[ 2., 4.],
[ 4., 6.],
[ 6., 8.],
[ 8., 10.]])
Обновление заканчивается.
Я думаю, что ты пытаешься сделать
np.array([[np.nan, np.nan], *5*[[1, 2]]])
Вы также можете сделать повторяющуюся сторону
np.repeat([[np.nan,np.nan],[1,2]], [1,5], axis=0)
Использование *
для распаковки внутреннего списка является ключом:
In [394]: np.array([[100,101],*[[1,2] for _ in range(3)]])
Out[394]:
array([[100, 101],
[ 1, 2],
[ 1, 2],
[ 1, 2]])
Сравните эти 2 списка:
In [395]: [[100,101],*[[1,2] for _ in range(3)]]
Out[395]: [[100, 101], [1, 2], [1, 2], [1, 2]]
In [396]: [[100,101],[[1,2] for _ in range(3)]]
Out[396]: [[100, 101], [[1, 2], [1, 2], [1, 2]]]
Если вы правильно вложите списки во входные данные, то np.array
даст вам правильный массив.
Без распаковки списки 2-го уровня имеют разные размеры, и вы получаете массив объектов:
In [398]: np.array([[100,101],[[1,2] for _ in range(3)]])
Out[398]: array([list([100, 101]), list([[1, 2], [1, 2], [1, 2]])], dtype=object)
concatenate
(vstack
) могут объединить эти два подсписка в массив желаний:
In [400]: np.vstack(_)
Out[400]:
array([[100, 101],
[ 1, 2],
[ 1, 2],
[ 1, 2]])
Я не думаю, что с методом vstack
что-то не так. Это может быть легче понять, особенно если вы не используете *alist
очень часто.
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.