【问题标题】:Assigning values to specific subscript indices in 3D python array throws errors将值分配给 3D python 数组中的特定下标索引会引发错误
【发布时间】:2017-08-27 21:31:00
【问题描述】:

假设我已经将一个 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_multi_index() 将下标索引转换为线性索引,但它似乎无法转换 3D 数组的下标索引。

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

【问题讨论】:

  • MATLAB 的默认设置是将数组索引为块,在本例中为 (100,100,40) 块。最接近的 numpy 等效项是 arr_3d[np.ix_(i,j,k)],其中 np.ix_ 将 3 个平面数组转换为 3d 数组。单独运行 np.ix_ 表达式(对于较小的样本)以查看它的作用。有关 numpy 索引的更多信息,请访问 docs.scipy.org/doc/numpy/reference/…
  • numpy [i,j,k] 索引更像是 MATLAB 的线性索引与 idx = sub2ind(size(A), i,j,k)
  • @hpaulj:谢谢,保罗。它似乎正在工作,但订单没有得到维护。例如,a = np.zeros((4, 4, 4))a[np.ix_([0,1,2,3], [0,1,2,3], [0,1])] = 1 返回一个数组,其第 2 维和第 3 维元素被交换了。

标签: python arrays numpy 3d indices


【解决方案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 在最后完成它。所以这显示了 2 个平面或块,每个 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 2019-11-08
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    相关资源
    最近更新 更多