python – 花式索引沿多个轴的numpy数组的最佳实践
发布时间:2020-12-20 11:38:45 所属栏目:Python 来源:网络整理
导读:我正在尝试优化算法以减少内存使用量,并且我已经将此特定操作确定为一个痛点. 我有一个对称矩阵,沿着行的索引数组,以及沿着列的另一个索引数组(这只是我没有在行索引中选择的所有值).我觉得我应该能够同时传入两个索引,但我发现自己被迫沿着一个轴选择然后另
我正在尝试优化算法以减少内存使用量,并且我已经将此特定操作确定为一个痛点.
我有一个对称矩阵,沿着行的索引数组,以及沿着列的另一个索引数组(这只是我没有在行索引中选择的所有值).我觉得我应该能够同时传入两个索引,但我发现自己被迫沿着一个轴选择然后另一个轴,这导致一些内存问题,因为我实际上并不需要副本返回的数组,只是我正在计算的统计数据.这是我想要做的: from scipy.spatial.distance import pdist,squareform from sklearn import datasets import numpy as np iris = datasets.load_iris().data dx = pdist(iris) mat = squareform(dx) outliers = [41,62,106,108,109,134,135] inliers = np.setdiff1d( range(iris.shape[0]),outliers) # What I want to be able to do: scores = mat[inliers,outliers].min(axis=0) 以下是我实际做的工作: # What I'm being forced to do: s1 = mat[:,outliers] scores = s1[inliers,:].min(axis=0) 因为我喜欢索引,所以s1是一个新数组而不是视图.我只需要这个数组用于一个操作,所以如果我可以消除在这里返回一个副本或至少使新数组变小(即通过尊重第二个花哨的索引选择,而我正在做第一个而不是两个独立的花式索引操作)这将是更可取的. 解决方法
“广播”适用于索引.您可以将内点转换为列矩阵(例如inliers.reshape(-1,1)或inliers [:,np.newaxis],因此它具有形状(m,1))和索引mat与第一列中的内容:
s1 = mat[inliers.reshape(-1,1),outliers] scores = s1.min(axis=0) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |