我知道多维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
的值。
答案 0 :(得分:3)
为了在广播期间正确解析您的索引,我们需要两个数组a
和b
,以便raster[a[i,j,k],b[i,j,k],indx[i,j,k]]
raster[i,j,indx[i,j,k]]
为i
,在j
轴的相应范围内k
,indx
。
最简单的解决方案是:
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个随机值。
,您可以通过列表理解来完成此操作这是一个使用较少数量的值和整数的示例,因此输出更容易阅读:
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)