加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读