Краткий способ объявить матовую матрицу

1

Что такое короткий, читаемый способ объявить матрицу нумерации 999x999, где каждая строка [1,2,3,...,999]? Конечная матрица должна быть:

[[1,2,3,...,999]
[1,2,3,...,999]
...
[1,2,3,...,999]]
Теги:
arrays
numpy

2 ответа

5
Лучший ответ

Вы можете использовать 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)
  • 1
    да, это работает, спасибо за подсказку
  • 0
    Ох, а также, кажется, этот синтаксис работает: np.array([[x + 1 for x in range(999)] for y in range (999)]) , я был просто смущен тем, как метод print выводит результат, поэтому я думал, что я был не прав (должен был проверить форму)
Показать ещё 6 комментариев
1

@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
  • 1
    Я на самом деле вижу np.tile два раза быстрее, чем версия, инициализированная с помощью np.empty (Python 3.6.5 / NumPy 1.14.3). Можете ли вы посоветовать свои версии?
  • 1
    Я получаю 1.41ms для empty версии и 1.46ms для tile версии (Numpy 1.15.0, CPython 3.7.0, 64-разрядные, python.org MacOS установки). Это говорит о том, что любой, кому небезразлична производительность, должен на своей реальной системе проверить свои настоящие данные, а не просто принять то, что какой-то парень в интернете считает универсально верным.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню