Python多维数组

时间:2018-12-07 15:40:09

标签: python arrays numpy matrix

在python中,最好是作为numpy数组,我如何才能在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 :(得分:1)

您正在跳过内部循环中的索引。如果您希望保留它,那么它实际上不是数组,而是键值对映射(又名字典)。

字典中不能有可变键,但是可以使用元组。

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)

答案 1 :(得分:0)

您可以使用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))

您基本上在PHP中使用90、120、150、180 ...作为索引,但是在python中,您将不得不使用连续索引,其中90-> 0,120-> 1,150-> 2, 180-> 3,依此类推。因此,对于xy,您只需要15个索引(PHP中x和y数组的长度)