Быстрое расширение массива numpy

#python #arrays #numpy

#python #массивы #numpy

Вопрос:

Интересно, есть ли какой-нибудь трюк для расширения массива numpy последовательными числами между исходными значениями до длины, контролируемой пользователем по умолчанию. Возможно, уже есть встроенная функция, которая превращает x в y

 x=np.array([4,8,4,10])

y=np.array([4,5,6,7,8,9,10,11,4,5,6,7,10,11,12,13])
  

Здесь длина между каждым элементом, который я добавил, составляла три. Здесь важна скорость. Мне нужно что-то подобное, чтобы мои данные столбца работали при создании разреженной
матрицы.

Кроме того, если у меня есть массив, такой как

 s=np.array([0,1])
  

есть ли быстрый способ расширить каждый элемент произвольное количество
раз, скажем, 4, например:

 s=np.array([0,0,0,0,1,1,1,1])
  

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

1. Для второй половины вашего вопроса взгляните на numpy.repeat или numpy.tile .

Ответ №1:

Широковещательное добавление, вероятно, самое быстрое

 In [241]: (x[:,None] np.arange(4)).ravel()
Out[241]: array([ 4,  5,  6,  7,  8,  9, 10, 11,  4,  5,  6,  7, 10, 11, 12, 13])
  

Это становится сложнее, если добавлять разные суммы для каждого подсписка.

repeat полезно:

 In [242]: np.repeat(np.array([0,1]),[3,4])
Out[242]: array([0, 0, 0, 1, 1, 1, 1])
  

tile еще один хороший инструмент.

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

1. Все отличные методы, ребята, этот был самым быстрым. Махало!

Ответ №2:

Я не знаю встроенной функции, которая делает именно это, но с некоторой креативностью вы могли бы сделать:

 >>> x=np.array([4,8,4,10])
>>> np.array([x i for i in range(4)]).T.ravel()
array([ 4,  5,  6,  7,  8,  9, 10, 11,  4,  5,  6,  7, 10, 11, 12, 13])
  

Для второй половины вашего вопроса взгляните на numpy.repeat и numpy.tile .

Ответ №3:

Это работает со списками:

 def extend(myList, n):
    extensions = [range(x, x   n) for x in myList]
    return [item for sublist in extensions for item in sublist] # flatten
  

Используйте следующим образом:

 extend([4, 8, 4, 10], 4)