Как это использование Ора о linspace
предполагает старт 0 для всех строк.
x=np.linspace(0,1,N)[:,None]*np.arange(0,2*N,2)
(редактирование - это транспонированная то, что я должен получить, либо перенести его или переключить использование [:,None]
)
Для N = 3000, это заметно быстрее, чем @Divaker's
решения. Я не совсем понимаю, почему.
In [132]: timeit N=3000;x=np.linspace(0,1,N)[:,None]*np.arange(0,2*N,2)
10 loops, best of 3: 91.7 ms per loop
In [133]: timeit create_ranges(np.zeros(N),np.arange(0,2*N,2),N)
1 loop, best of 3: 197 ms per loop
In [134]: def foo(N):
...: D=np.ones((N,N))*np.arange(N)
...: D=D/D[:,-1]
...: W=np.arange(0,2*N,2)
...: return (D.T*W).T
...:
In [135]: timeit foo(3000)
1 loop, best of 3: 454 ms per loop
============
С начала и остановки я мог бы использовать:
In [201]: starts=np.array([1,4,2]); stops=np.array([6,7,8])
In [202]: x=(np.linspace(0,1,5)[:,None]*(stops-starts)+starts).T
In [203]: x
Out[203]:
array([[ 1. , 2.25, 3.5 , 4.75, 6. ],
[ 4. , 4.75, 5.5 , 6.25, 7. ],
[ 2. , 3.5 , 5. , 6.5 , 8. ]])
С дополнительных вычислений, что делает его немного медленнее, чем create_ranges
,
In [208]: timeit N=3000;starts=np.zeros(N);stops=np.arange(0,2*N,2);x=(np.linspace(0,1,N)[:,None]*(stops-starts)+starts).T
1 loop, best of 3: 227 ms per loop
Все эти решения являются лишь вариации идея сделать линейной интерполяции между starts
и stops
.
Если вы хотите использовать pandas: 'pd.Series (W) .apply (lambda e: np.linspace (0, e, 3))' – Boud
В принципе у вас есть два вектора (первый и последний столбцы вашей матрицы) , верный? И тогда вы хотели бы интерполировать некоторые значения для каждой строки. – Kartik
@dayum, если вы хотите изменить начальные позиции, это тот же подход, но вы создаете df с двумя векторами, начинаете и останавливаетесь в нем, и вы вызываете снова применение с аргументом лямбда: df.start, df.end, 3 – Boud