索引多维数组

时间:2015-08-12 10:33:07

标签: python arrays numpy multidimensional-array indexing

我知道多维numpy数组可能会被其他数组索引,但我没有弄清楚以下是如何工作的:

我想拥有来自raster的项目,这是一个基于indx的3d numpy数组,一个3d索引数组:

raster=np.random.rand(5,10,50)
indx=np.random.randint(0, high=50, size=(5,10,3))

我想要的是另一个维度为indx的数组,该数组根据raster的索引保存indx的值。

3 个答案:

答案 0 :(得分:3)

为了在广播期间正确解析您的索引,我们需要两个数组ab,以便raster[a[i,j,k],b[i,j,k],indx[i,j,k]] raster[i,j,indx[i,j,k]]i,在j轴的相应范围内kindx。 最简单的解决方案是:

x,y,z = indx.shape
a,b,_ = np.ogrid[:x,:y,:z]
raster[a,b,indx]

np.ogrid[...]创建三个形状为(x,1,1)(1,y,1)(1,1,z)的数组。我们不需要最后一个,所以我们扔掉它。现在,当其他两个用indx广播时,它们的行为完全符合我们的需要。

答案 1 :(得分:1)

如果我正确理解了问题,那么对于indx的每一行,您都要尝试索引raster中的相应行,但列数会因{{1}中的实际值而异}}。因此,根据该假设,您可以使用使用线性索引的矢量化方法,如此 -

indx

答案 2 :(得分:0)

我假设你想从每个第三维数组中获得3个随机值。

感谢advanced indexing

,您可以通过列表理解来完成此操作

这是一个使用较少数量的值和整数的示例,因此输出更容易阅读:

import numpy as np

raster=np.random.randint(0, high=1000, size=(2,3,10))
indices=np.random.randint(0, high=10, size=(2,3,3))
results = np.array([ np.array([ column[col_indices] for (column, col_indices) in zip(row, row_indices) ]) for (row, row_indices) in zip(raster, indices) ])

print("Raster:")
print(raster)
print("Indices:")
print(indices)
print("Results:")
print(results)

<强>输出:

Raster:
[[[864 353  11  69 973 475 962 181 246 385]
  [ 54 735 871 218 143 651 159 259 785 383]
  [532 476 113 888 554 587 786 172 798 232]]

 [[891 263  24 310 652 955 305 470 665 893]
  [260 649 466 712 229 474   1 382 269 502]
  [323 513  16 236 594 347 129  94 256 478]]]
Indices:
[[[0 1 2]
  [7 5 1]
  [7 8 9]]

 [[4 0 2]
  [6 1 4]
  [3 9 2]]]
Results:
[[[864 353  11]
  [259 651 735]
  [172 798 232]]

 [[652 891  24]
  [  1 649 229]
  [236 478  16]]]

它在 raster indices 中的相应第三维数组上同时迭代,并使用高级索引从 raster 中切割所需的索引。 / p>

这是一个更详细的版本,完全相同:

results = []
for i in range(len(raster)):
    row = raster[i]
    row_indices = indices[i]
    row_results = []
    for j in range(len(row)):
        column = row[j]
        column_indices = row_indices[j]
        column_results = column[column_indices]
        row_results.append(column_results)
    results.append(np.array(row_results))
results = np.array(results)