Назначить 1d numpy ndarray на столбцы 2d массива - PullRequest
2 голосов
/ 10 марта 2020

Предположим, dst это ndarray с формой (5, N), а ramp это ndarray с формой (5,). (В данном случае N = 2):

>>> dst = np.zeros((5, 2))
>>> dst
array([[0., 0.],
       [0., 0.],
       [0., 0.],
       [0., 0.],
       [0., 0.]])
>>> ramp = np.linspace(1.0, 2.0, 5)
>>> ramp
array([1.  , 1.25, 1.5 , 1.75, 2.  ])

Теперь я хотел бы скопировать рампу в столбцы dst, в результате чего:

>>> dst
array([[1., 1.],
       [1.25., 1.25.],
       [1.5., 1.5.],
       [1.75, 1.75],
       [2.0, 2.0]])

Я не сделал ожидайте, что это сработает, а это не так:

>>> dst[:] = ramp
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not broadcast input array from shape (5) into shape (5,2)

Это работает, но я уверен, что есть более «нумпейский» способ выполнить sh это:

>>> dst[:] = ramp.repeat(dst.shape[1]).reshape(dst.shape)
>>> dst
array([[1.  , 1.  ],
       [1.25, 1.25],
       [1.5 , 1.5 ],
       [1.75, 1.75],
       [2.  , 2.  ]]) 

Есть идеи?

note

В отличие от "клонирования" векторов строк или столбцов , я хочу присвоить ramp в dst (или даже в подмножестве dst). Кроме того, приведенное там решение использует массив python в качестве источника, а не ndarray, и поэтому требует вызовов .transpose, et c.

1 Ответ

1 голос
/ 10 марта 2020

Метод 1 : Использовать трансляцию:

Как указано в комментарии в ОП. Вещание работает и на вещании

dst[:] = ramp[:,None]

Метод 2 : Использование column_stack

N = dst.shape[1]
dst[:] = np.column_stack([ramp.tolist()]*N)

Out[479]:
array([[1.  , 1.  ],
       [1.25, 1.25],
       [1.5 , 1.5 ],
       [1.75, 1.75],
       [2.  , 2.  ]])

Метод 3 : использовать np.tile

N = dst.shape[1]
dst[:] = np.tile(ramp[:,None], (1,N))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...