Если вы хотите создать списки повторяющихся значений, вы можете использовать умножение списков / кортежей ...
>>> import numpy
>>> numpy.array((1, 2, 3) * 3)
array([1, 2, 3, 1, 2, 3, 1, 2, 3])
>>> numpy.array((0.2, 0.4, 0.6, 0.8) * 3).reshape((3, 4))
array([[ 0.2, 0.4, 0.6, 0.8],
[ 0.2, 0.4, 0.6, 0.8],
[ 0.2, 0.4, 0.6, 0.8]])
Спасибо за обновление вашего вопроса - теперь все намного понятнее. Хотя я думаю, ответ joris является лучшим в этом случае (потому что он более читабелен), я укажу, что новый код, который вы разместили, также можно обобщить так:
>>> arr = numpy.arange(1, N + 1) / (N + 1.0)
>>> X = arr[numpy.indices((N, N))[0]].flatten()
>>> Y = arr[numpy.indices((N, N))[1]].flatten()
Во многих случаях при использовании numpy
можно избежать циклов while, используя мощную систему индексации numpy
. Как правило, когда вы используете массив I
для индексирования массива A
, результатом является массив J
той же формы, что и I
. Для каждого индекса i
в I
значение A[i]
присваивается соответствующей позиции в J
. Например, скажем, у вас есть arr = numpy.arange(0, 9) / (9.0)
, и вы хотите значения в индексах 3
, 5
и 8
. Все, что вам нужно сделать, это использовать numpy.array([3, 5, 8])
в качестве индекса для arr
:
>>> arr
array([ 0. , 0.11111111, 0.22222222, 0.33333333, 0.44444444,
0.55555556, 0.66666667, 0.77777778, 0.88888889])
>>> arr[numpy.array([3, 5, 8])]
array([ 0.33333333, 0.55555556, 0.88888889])
Что, если вам нужен 2-й массив? Просто введите двумерный индекс:
>>> arr[numpy.array([[1,1,1],[2,2,2],[3,3,3]])]
array([[ 0.11111111, 0.11111111, 0.11111111],
[ 0.22222222, 0.22222222, 0.22222222],
[ 0.33333333, 0.33333333, 0.33333333]])
>>> arr[numpy.array([[1,2,3],[1,2,3],[1,2,3]])]
array([[ 0.11111111, 0.22222222, 0.33333333],
[ 0.11111111, 0.22222222, 0.33333333],
[ 0.11111111, 0.22222222, 0.33333333]])
Поскольку вам не нужно постоянно вводить подобные индексы, вы можете генерировать их автоматически - с помощью numpy.indices
:
>>> numpy.indices((3, 3))
array([[[0, 0, 0],
[1, 1, 1],
[2, 2, 2]],
[[0, 1, 2],
[0, 1, 2],
[0, 1, 2]]])
В двух словах, так работает приведенный выше код. (Также проверьте numpy.mgrid
и numpy.ogrid
- которые предоставляют немного более гибкие генераторы индекса.)
Поскольку многие numpy
операции векторизованы (то есть они применяются к каждому элементу в массиве), вам просто нужно найти правильные индексы для задания - циклы не требуются.