我有張量A,使A.shape =(32,19,2)和一個二元矩陣B,使B.shape =(32,19)。是否可以通過單行操作獲得矩陣C,其中C.shape =(32,19)和C(i,j)= A [i,j,B [i,j]]?基本上,我想用B作爲索引矩陣,其中如果B [i,j] = 1,我用A [i,j,1]來形成C(i,j)。索引張量與二進制矩陣在numpy
3
A
回答
0
可以使用列表理解做到這一點:
C = np.array([[A[i, j, B[i, j]] for j in range(A.shape[1])] for i in range(A.shape[0])])
0
C = A[:,:,0]*(B==0) + A[:,:,1]*(B==1)
應該工作。如果你需要索引更多的飛機,你可以把它推廣爲np.sum([A[:,:,k]*(B==k) for k in np.arange(A.shape[-1])], axis=0)
。
2
np.where
來救援。這是同樣的原理mtrw's
答案:
In [344]: A=np.arange(4*3*2).reshape(4,3,2)
In [345]: B=np.zeros((4,3),dtype=int)
In [346]: B[[0,1,1,2,3],[0,0,1,2,2]]=1
In [347]: B
Out[347]:
array([[1, 0, 0],
[1, 1, 0],
[0, 0, 1],
[0, 0, 1]])
In [348]: np.where(B,A[:,:,1],A[:,:,0])
Out[348]:
array([[ 1, 2, 4],
[ 7, 9, 10],
[12, 14, 17],
[18, 20, 23]])
np.choose
可如果最後的尺寸大於2使用(但小於32)。 (choose
操作的列表或第一維度上,因此rollaxis
。
In [360]: np.choose(B,np.rollaxis(A,2))
Out[360]:
array([[ 1, 2, 4],
[ 7, 9, 10],
[12, 14, 17],
[18, 20, 23]])
B
也可以直接用作指標。訣竅是在廣播到相同的形狀的方式來指定其它尺寸。
In [373]: A[np.arange(A.shape[0])[:,None], np.arange(A.shape[1])[None,:], B]
Out[373]:
array([[ 1, 2, 4],
[ 7, 9, 10],
[12, 14, 17],
[18, 20, 23]])
這最後一種方法可以修改工作的時候B
不匹配的A
1日2種尺寸。
np.ix_
馬y簡化此索引
I, J = np.ix_(np.arange(4),np.arange(3))
A[I, J, B]
相關問題
- 1. 索引一個numpy的二維矩陣
- 2. 矩陣的張量積在Numpy/python中
- 3. Numpy中的矩陣索引
- 4. Numpy:矩陣乘以3D張量 - 建議
- 5. MATLAB:在方形二進制矩陣中查找「平均」索引
- 6. 索引在numpy的第二陣列
- 7. 在numpy中對二進制矩陣的有效操作
- 8. 二進制矩陣SQL
- 9. 二進制矩陣條目
- 10. 子集二進制矩陣
- 11. 隨機二進制矩陣
- 12. 在大二進制矩陣中計算小二進制矩陣的外觀
- 13. numpy索引與陣列
- 14. 矩陣索引製作新矩陣
- 15. 在Pandas繪製二進制矩陣
- 16. numpy - 從矩陣索引計算值
- 17. numpy:按索引拆分矩陣
- 18. Numpy:爲稀疏矩陣創建索引
- 19. Numpy矩陣的複合索引更新
- 20. 使用2d矩陣加矢量對3D矩陣進行索引
- 21. Tensorflow中四維張量的tf.nn.top_k索引的二進制掩碼?
- 22. 使用張量流將3D矩陣轉換成二維矩陣
- 23. 使用2D矩陣作爲numpy 3D矩陣的索引?
- 24. 增廣矩陣在與NumPy
- 25. theano〜使用索引矩陣並嵌入矩陣來產生3D張量?
- 26. 將二維numpy陣列轉換爲二維numpy矩陣
- 27. 在二維矩陣中圍繞索引搜索周圍索引
- 28. 向量化numpy索引並應用函數來構建矩陣
- 29. 如何找到向量化矩陣numpy的索引
- 30. 在Matlab中對矩陣進行索引