Numpy: как правильно заполнить массив? - PullRequest
3 голосов
/ 16 марта 2012

Я хотел бы создать трехмерный массив в numpy следующим образом:

[ 0 1 0 1 0 1
  0 1 0 1 0 1
  0 1 0 1 0 1
  0 1 0 1 0 1
  0 1 0 1 0 1 ] ...

Есть ли хороший способ написать это?

Ответы [ 3 ]

6 голосов
/ 16 марта 2012

Использование np.tile:

import numpy as np
a = np.array([0, 1])
my_tiled_array = np.tile(a, (3, 3))

Результат:

array([[0, 1, 0, 1, 0, 1],
       [0, 1, 0, 1, 0, 1],
       [0, 1, 0, 1, 0, 1]])

Edit:
Как подсказывает @DSM в комментарии, если вы действительно хотите использовать 3D-массив, что не совсем понятно из вашего примера кода, вы можете использовать:

my_3d_tiled_arr = np.tile(a, (3, 3, 3))

Результат:

array([[[0, 1, 0, 1, 0, 1],
        [0, 1, 0, 1, 0, 1],
        [0, 1, 0, 1, 0, 1]],

       [[0, 1, 0, 1, 0, 1],
        [0, 1, 0, 1, 0, 1],
        [0, 1, 0, 1, 0, 1]],

       [[0, 1, 0, 1, 0, 1],
        [0, 1, 0, 1, 0, 1],
        [0, 1, 0, 1, 0, 1]]])
1 голос
/ 17 марта 2012

@ Метод Берни великолепен. Более быстрый способ достижения той же цели может состоять в том, чтобы перемещать элементы (виртуально), а не копировать пару [0, 1] много раз. Вы можете сделать следующее:

import numpy as np
A1 = np.concatenate([np.zeros(108), np.ones(108)]).reshape((2,108))
A2 = A1.transpose()
A3 = A2.reshape((6,6,6))

Первая строка инициализирует кучу нулей и единиц и упаковывает их в массив 2x108. Вторая строка едва превращает его в массив 108x2. Затем последняя строка повторно разрезает массив так, что он равен 6x6x6 и выглядит так, как вы ищете.

Единственное, на что нужно обратить внимание - это количество элементов. Скажем, вам нужен окончательный трехмерный массив 6x6x6, как в моем примере, вы умножаете длину всех осей (что дает нам 216), а затем делите на 2 (= 108). Это число равно числу единиц и нулей, а также числу, используемому в вызове функции .reshape((2, n)).

Причина, по которой это происходит так быстро, заключается в том, что инициализация векторов из нулей или единиц действительно быстрая, быстрее, чем копирование произвольного массива. Затем движущиеся элементы, как то, что делают .transpose() и .reshape(), лишь изменяют способ ссылки на элементы вместо перемещения самих элементов в памяти.

1 голос
/ 16 марта 2012

Если вам нужен 1-D массив, (опять же, не совсем понятно, что вы хотите), вы можете сделать что-то вроде:

np.mod(np.arange(10),2)
Out[4]: array([0, 1, 0, 1, 0, 1, 0, 1, 0, 1])

, которое, конечно, можно изменить при необходимости.Но я думаю, что ответ Берни намного лучше и яснее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...