2017-08-27 49 views
-1

說我有初始化三維數組爲:分配值在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的作品。

+2

MATLAB的默認值是將數組索引爲塊,在本例中爲(100,100,40)塊。最接近的numpy等價物是'arr_3d [np.ix_(i,j,k)]',其中'np.ix_'將3個平面陣列轉換成3d陣列。單獨運行'np.ix_'表達式(對於較小的樣本)來查看它的功能。有關numpy索引的更多信息,請訪問https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#integer-array-indexing – hpaulj

+0

numpy'[i,j,k]'索引更像是MATLAB線性用'idx = sub2ind(size(A),i,j,k)'索引。 – hpaulj

+0

@hpaulj:謝謝,保羅。它似乎在工作,但訂單不被維護。例如,'a = np.zeros((4,4,4))'和'a [np.ix _([0,1,2,3],[0,1,2,3],[0 ,1])] = 1'返回一個數組,其第二維和第三維元素已被交換。 – user11

回答

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。

在八度的2x3的

>> 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塊。