在3D python数组中将值指定给特定的下标索引会引发错误

在3D python数组中将值指定给特定的下标索引会引发错误,python,arrays,numpy,3d,indices,Python,Arrays,Numpy,3d,Indices,假设我已将3D中的数组初始化为: arr_3d = np.zeros((100, 100, 100)) 现在我想将arr_3d的下标索引(I,j,k)处的元素更改为某个值(比如1),其中I,j,k是沿着三个轴分别具有大小100,100,40的索引列表(或数组)。我尝试了arr_3d[I,j,k]=1,但它抛出了一个错误。我曾尝试通过np.ravel\u multi\u index()将下标索引转换为线性索引,但它似乎无法转换3D数组的下标索引 上述问题在Matlab中很容易解决,其中使用arr

假设我已将3D中的数组初始化为:

arr_3d = np.zeros((100, 100, 100))
现在我想将
arr_3d
的下标索引
(I,j,k)
处的元素更改为某个值(比如1),其中
I,j,k
是沿着三个轴分别具有大小
100,100,40
的索引列表(或数组)。我尝试了
arr_3d[I,j,k]=1
,但它抛出了一个错误。我曾尝试通过
np.ravel\u multi\u index()
将下标索引转换为线性索引,但它似乎无法转换3D数组的下标索引


上述问题在Matlab中很容易解决,其中使用
arr_3d(i,j,k)=1
是可行的。

尝试使用不同的维度,即不同的维度

In [1375]: a=np.zeros((2, 3, 4))
In [1376]: a[np.ix_([0], [1,2], [0,1])] = 1
In [1377]: a
Out[1377]: 
array([[[ 0.,  0.,  0.,  0.],
        [ 1.,  1.,  0.,  0.],
        [ 1.,  1.,  0.,  0.]],

       [[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]]])
numpy
在第一维度上将数组划分为“平面”;MATLAB在最后一节中完成了这项工作。这显示了两个平面或块,每个3x4

八度

>> a = zeros(2,3,4);
>> a([1],[2,3],[1,2]) = 1
a =

ans(:,:,1) =

   0   1   1
   0   0   0

ans(:,:,2) =

   0   1   1
   0   0   0

ans(:,:,3) =

   0   0   0
   0   0   0

ans(:,:,4) =

   0   0   0
   0   0   0

4块2x3。

MATLAB的默认设置是将数组索引为块,在本例中为(100100,40)块。最接近的numpy等价物是
arr_3d[np.ix_(i,j,k)]
,其中
np.ix_
将3个平面阵列转换为3d阵列。单独运行
np.ix
表达式(对于较小的示例),查看它的功能。有关numpy索引的更多信息,请访问numpy
[i,j,k]
索引更像MATLABs线性索引,具有
idx=sub2ind(大小(A),i,j,k)
@hpaulj:谢谢,Paul。它似乎起作用了,但秩序没有维持。例如,
a=np.zeros((4,4,4))
,和
a[np.ix([0,1,2,3],[0,1,2,3],[0,1])]=1
返回一个数组,该数组的第2维和第3维元素被替换。