Еще Pythonic / элегантный способ заполнить 2D-массив последовательностями целых чисел? - PullRequest
0 голосов
/ 21 февраля 2019

Я смотрю вступительное видео на NumPy на YouTube: Введение в числовые вычисления с NumPy

В 39:00 он начинает обсуждать примеры с матрицей 6x6, спервая строка заполнена: 0, 1, ..., 5, вторая строка заполнена 10, 11, ... , 15, а последняя строка заполнена 50, 51, ... , 55.

Я думал об использовании (1) nested (двухслойный) составление списка, а затем преобразование списка в объект numpy.matrix, или (2) с использованием переменных внутри функции range, то есть - range(x) и варьирование xот 1 до 6. Я не смог заставить ни одну из этих двух идей работать.

Ниже приведен мой не векторизованный / циклический код для построения этой матрицы.Есть ли более Pythonic способ сделать это?Большое спасибо!

a = np.zeros((6,6))
for i in range(6):
    for j in range(6):
        a[i,j] = 10*i + j
print(a)

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Этого можно добиться с помощью трансляции,

arange(0, 6) + 10*arange(0, 6)[:, None]

array([[ 0,  1,  2,  3,  4,  5],
   [10, 11, 12, 13, 14, 15],
   [20, 21, 22, 23, 24, 25],
   [30, 31, 32, 33, 34, 35],
   [40, 41, 42, 43, 44, 45],
   [50, 51, 52, 53, 54, 55]])

Я бы порекомендовал прочитать https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html и https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html. "Pythonic" не имеет большого значения при работе с numpy.Иногда итерации, списки и другие подходы к питону хорошо работают с массивами, иногда они ужасно неэффективны.Тем не менее, приведенные ссылки охватывают некоторые концепции высокого уровня, которые очень мощные с NumPy.

0 голосов
/ 21 февраля 2019

Как насчет np.ogrid?

np.add(*np.ogrid[:60:10, :6]) 

# array([[ 0,  1,  2,  3,  4,  5],
#        [10, 11, 12, 13, 14, 15],
#        [20, 21, 22, 23, 24, 25],
#        [30, 31, 32, 33, 34, 35],
#        [40, 41, 42, 43, 44, 45],
#        [50, 51, 52, 53, 54, 55]])

Подробности
ogrid возвращает открытую сетку:

a, b = np.ogrid[:60:10, :6]
a

# array([[ 0],
#        [10],
#        [20],
#        [30],
#        [40],
#        [50]])

b
# array([[0, 1, 2, 3, 4, 5]])

Вы можете затем выполнить добавленное вещание:

# a + b
np.add(a, b)

# array([[ 0,  1,  2,  3,  4,  5],
#        [10, 11, 12, 13, 14, 15],
#        [20, 21, 22, 23, 24, 25],
#        [30, 31, 32, 33, 34, 35],
#        [40, 41, 42, 43, 44, 45],
#        [50, 51, 52, 53, 54, 55]])

Аналогично, вы также можете создать два диапазона, используя np.arange и добавить их:

np.arange(0, 60, 10)[:,None] + np.arange(6)

# array([[ 0,  1,  2,  3,  4,  5],
#        [10, 11, 12, 13, 14, 15],
#        [20, 21, 22, 23, 24, 25],
#        [30, 31, 32, 33, 34, 35],
#        [40, 41, 42, 43, 44, 45],
#        [50, 51, 52, 53, 54, 55]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...