Что такое короткий, читаемый способ объявить матрицу нумерации 999x999, где каждая строка [1,2,3,...,999]
? Конечная матрица должна быть:
[[1,2,3,...,999]
[1,2,3,...,999]
...
[1,2,3,...,999]]
Вы можете использовать numpy.tile
:
import numpy as np
res = np.tile(range(10), (5, 1))
print(res)
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
Кроме того, вы можете добавить к массиву нулей:
res = np.zeros((5, 10)) + range(10)
@jpp отвечает элегантно, но следующее решение более эффективно:
res = np.empty((nrows, ncols))
res[:, :] = np.arange(ncols)
Сроки:
%timeit a = np.empty((1000,1000)); a[:, :] = np.arange(1000)
445 µs ± 9.08 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit np.tile(range(1000), (1000, 1))
1.43 ms ± 15.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Другие временные тесты:
После комментариев @jpp я добавил еще один тест, сделанный непосредственно в интерпретаторе Python (в отличие от первоначального теста, который был запущен в ноутбуке Jupyter, потому что он был запущен и работает в этот момент):
>>> import sys
>>> print(sys.version)
3.6.5 |Anaconda, Inc.| (default, Apr 26 2018, 08:42:37)
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)]
>>> import numpy as np
>>> print(np.__version__)
1.13.3
>>> import timeit
>>> t = timeit.repeat('res = np.empty((nrows, ncols)); res[:, :] = np.arange(ncols)', setup='import numpy as np; nrows=ncols=1000', number=100, repeat=50)
>>> print(min(t), max(t), np.mean(t), np.std(t))
0.04336756598786451 0.053294404002372175 0.0459639201409 0.00240180447219
>>> t = timeit.repeat('res = np.tile(range(ncols), (nrows, 1))', setup='import numpy as np; nrows=ncols=1000', number=100, repeat=50)
>>> print(min(t), max(t), np.mean(t), np.std(t))
0.05032560401014052 0.05859642301220447 0.0530669655403 0.00225117881195
Результаты с numpy 1.14.5
практически идентичны:
>>> import sys
>>> print(sys.version)
3.6.6 |Anaconda, Inc.| (default, Jun 28 2018, 11:07:29)
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)]
>>> import numpy as np
>>> print(np.__version__)
1.14.5
>>> import timeit
>>> t = timeit.repeat('res = np.empty((nrows, ncols)); res[:, :] = np.arange(ncols)', setup='import numpy as np; nrows=ncols=1000', number=100, repeat=50)
>>> print(min(t), max(t), np.mean(t), np.std(t))
0.04360878499574028 0.05562149798788596 0.04657964294136036 0.0025253372244474614
>>> t = timeit.repeat('res = np.tile(range(ncols), (nrows, 1))', setup='import numpy as np; nrows=ncols=1000', number=100, repeat=50)
>>> print(min(t), max(t), np.mean(t), np.std(t))
0.05024543400213588 0.06169128899637144 0.05339125283906469 0.00276210097759817
np.tile
два раза быстрее, чем версия, инициализированная с помощью np.empty
(Python 3.6.5 / NumPy 1.14.3). Можете ли вы посоветовать свои версии?
empty
версии и 1.46ms для tile
версии (Numpy 1.15.0, CPython 3.7.0, 64-разрядные, python.org MacOS установки). Это говорит о том, что любой, кому небезразлична производительность, должен на своей реальной системе проверить свои настоящие данные, а не просто принять то, что какой-то парень в интернете считает универсально верным.
np.array([[x + 1 for x in range(999)] for y in range (999)])
, я был просто смущен тем, как методprint
выводит результат, поэтому я думал, что я был не прав (должен был проверить форму)