python - 使用 Numpy 基于向量从 3D 矩阵中选择列
问题描述
所以我试图根据使用 Numpy 的向量中的值从 3D 矩阵中选择一些列。我已经使用列表理解解决了这个问题,但我认为使用 Numpy 的内置方法可能会有更好的方法。有谁知道这种方法或方法组合是否存在?
matrix1 = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
matrix2 = np.array([[10, 11, 12],
[13, 14, 15],
[16, 17, 18]])
total_matrix = np.array([matrix1, matrix2])
vector = [0,1,1]
# Retrieve the first column from the first matrix, second and third from the second matrix.
result = np.array([total_matrix[index2,: , index1] for index1, index2 in enumerate(vector)]).transpose()
# result:
np.array([[1, 11, 12],
[4, 14, 15],
[7, 15, 18]])
解决方案
In [58]: total_matrix[vector, np.arange(3)[:,None], np.arange(3)]
Out[58]:
array([[ 1, 11, 12],
[ 4, 14, 15],
[ 7, 17, 18]])
vector
索引第一个维度。另外2个广播用它来选择需要的(3,3)。虽然我知道一般原则,但在找到正确的一种之前,我尝试了多种变体(大约 9 种)。
在另一个答案中的使用diagonal
相当于做:
In [61]: total_matrix[vector][:,np.arange(3),np.arange(3)]
Out[61]:
array([[ 1, 5, 9],
[10, 14, 18],
[10, 14, 18]])
推荐阅读
- java - HttpMessageNotReadableException:JSON 解析错误:无法从字符串反序列化类型为“int”的值
- c++ - 是否可以/建议返回一个范围?
- r - 使用r中的循环根据连续行中的值之间的某些差异为记录分配唯一ID
- nginx - 连接到 nginx 后面的 Rancher Kube API 服务器时出现 kubectl 错误
- ansible - 在其他剧本之前准备剧本
- flutter - 扑腾打印
- gradle - 无法在我的 Windows 系统 linux 中运行 ./gradlew.jar
- .net-core - 我们如何为 .NET Core 3.1 应用程序集成 ReportViewer
- json - 如何在 swift 中增加 JSON perameter COUNT 值以进行分页
- sql - 如何在SQL中搜索超过十列的字符串