Поэтому я пытаюсь выяснить, есть ли способ сделать это похожим на цикл 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.

Любая помощь очень ценится.

1
akozi 13 Мар 2018 в 20:29

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)
3
Paul Panzer 13 Мар 2018 в 17:53

Использование * для распаковки внутреннего списка является ключом:

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 очень часто.

1
hpaulj 13 Мар 2018 в 17:55