gpt4 book ai didi

python - 沿多个轴花式索引 numpy 数组的最佳实践

转载 作者:太空狗 更新时间:2023-10-30 02:10:49 25 4
gpt4 key购买 nike

我正在尝试优化算法以减少内存使用,并且我已将此特定操作确定为痛点。

我有一个对称矩阵,一个沿着行的索引数组,以及另一个沿着列的索引数组(这只是我没有在行索引中选择的所有值)。我觉得我应该能够同时传递两个索引,但我发现自己被迫先沿一个轴选择,然后再沿另一个轴选择,这会导致一些内存问题,因为我实际上不需要的副本返回的数组,只是我从中计算的统计数据。这是我正在尝试做的事情:

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 是一个新数组而不是 View 。我只需要这个数组进行一个操作,所以如果我可以消除在此处返回副本或至少使新数组更小(即在我执行第一个而不是两个单独的花式索引操作时尊重第二个花式索引选择) 会更可取。

最佳答案

“广播”适用于索引。您可以将 inliers 转换为列矩阵(例如 inliers.reshape(-1,1)inliers[:, np.newaxis],所以它的形状 (m,1)) 和索引 mat 与第一列中的相同:

s1 = mat[inliers.reshape(-1,1), outliers]
scores = s1.min(axis=0)

关于python - 沿多个轴花式索引 numpy 数组的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26663314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com