Многомерный массив Python - PullRequest
0 голосов
/ 07 декабря 2018

В Python, предпочтительно в виде массива numy, как я могу получить структуру данных, точно так же, как в php:

$mdmat = array();
for($i=0;$i<50;$i++)
  for($x=90;$x<=510;$x+=30)
    for($y=50;$y<470;$y+=30)
       $mdmat[$i][$x][$y] = rand(0,1000);

Так что позже я могу изменить значение его элементов следующим образом:

$mdmat[1][120][80]= 5;

Мне нужны именно эти индексы массива.

Вот дамп этой структуры: https://gist.github.com/acosonic/68333d286b5684e42fbdf5b28bcf9101

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

вы пропускаете индексы во внутренних циклах.Если вы хотите сохранить это, то на самом деле это не массив, а отображение пары ключ-значение, иначе словарь.

Вы не можете иметь изменяемые ключи в словаре, но вместо этого можете использовать кортеж.

import random      
mdmat = {}      
for i in range(0, 50):
    for x in range(90, 510 + 1, 30): #the +1 is to handle <= condition, range are right exclusive
        for y in range(50, 470, 30):
            mdmat[(i, x, y)] = random.randint(0,1000)

РЕДАКТИРОВАТЬ: Глядя на ваше редактирование, вы можете реализовать ту же концепцию, что и вложенные словари с небольшой настройкой.

import random      
mdmat_root = {}      
for i in range(0, 50):
    mdmat_root[i] = {}
    for x in range(90, 510 + 1, 30): #the +1 is to handle <= condition, range are right exclusive
        mdmat_root[i][x] = {}
        for y in range(50, 470, 30):
            mdmat_root[i][x][y] = random.randint(0,1000)
0 голосов
/ 07 декабря 2018

Вы можете сделать это легко, используя np.random.randint, как указано ниже, где вы можете заменить (3,3,3) на нужный размер матрицы (i, j, k).

array = np.random.randint(0, 1000, (3,3,3))
print (array)

[[[581 956 971]
  [726  64 140]
  [891  83 666]]

 [[690 554 869]
  [325 611 908]
  [560 221 550]]

 [[878 979 488]
  [233 710 979]
  [273 462 945]]]

, а затем изменить, как вы хотите, используя

array[1][2][2] = 100
print (array)

[[[581 956 971]
  [726  64 140]
  [891  83 666]]

 [[690 554 869]
  [325 611 908]
  [560 221 100]]

 [[878 979 488]
  [233 710 979]
  [273 462 945]]]

Для вашего конкретного случая вы можете вычислить размер матрицы как i, j, k и затем использовать

i = 50
x = len(range(90, 511, 30))
y = len(range(50, 471, 30))

array = np.random.randint(0, 1000, (i,x,y))

В основном вы используете 90, 120, 150, 180 ...в качестве индексов в PHP, но в Python вам придется использовать непрерывные индексы, где 90 -> 0, 120 -> 1, 150 -> 2, 180 -> 3 и так далее.Следовательно, для x и y вам нужно всего 15 индексов (длина массивов x и y в PHP)

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