У меня разные целые начальные и конечные значения, и мне нужны все целые значения между ними в виде массивов в одном массиве формы (theRange, finalLength).
Пример:
finalLength = 6
start = 2
stop = 3456
theRange = (stop - start) + 1
>>> array([[0, 0, 0, 0, 0, 2],
[0, 0, 0, 0, 0, 3],
[0, 0, 0, 0, 0, 4],
...,
[0, 0, 3, 4, 5, 4],
[0, 0, 3, 4, 5, 5],
[0, 0, 3, 4, 5, 6]])
>>> array.shape (3455, 6)
Поскольку мне нужно запускать эту функцию миллиарды раз, текущий способ — замедление.
На данный момент я создаю нужный диапазон, используя np.linspace
. Целые числа разбиваются на цифры следующим образом (Разбить целое число на цифры с помощью numpy.
Если количество цифр наибольшего числа не равно finalLength, добавляются ведущие нули. Наконец, результирующий массив переворачивается и транспонируется в желаемый выходной формат. Я думаю, что целочисленное разделение и транспонирование занимают больше всего времени вычислений.
Время увеличивается с увеличением finalLength: Timeit 10000 повторений
finalLength = 6 --› время: 2,815263898999546
finalLength = 12 --› время: 4.158567378000043
finalLength = 24 --› время: 5.038266787999419
Есть ли более быстрый способ создать окончательный массив?
Воспроизводимый код:
import numpy as np
finalLength = 6
start = 2
stop = 3456
theRange = (stop - start) + 1
def makeRangeArray(start, stop, theRange, finalLength):
# create integers within range
ll = np.array(np.linspace(start=start, stop=stop, num=theRange), dtype=np.int64)
# split integers into arrays
b = 10
n = np.ceil(np.max(np.log(ll) / np.log(b))).astype(np.int64)
d = np.arange(n)
d.shape = d.shape + (1,) * ll.ndim
out = ll // b ** d % b
# add leading zeros if necessary
if finalLength - out.shape[0] != 0:
addZeros = np.zeros([finalLength - out.shape[0], out.shape[1]], dtype=np.int64)
out = np.append(out, addZeros, axis=0) # insert zeros at the end of array
# flip
out = np.flip(out, axis=0)
# transpose to desired final output format
aaa = out.transpose().reshape((theRange, finalLength))
return aaa