[英]Best practice for fancy indexing a numpy array along multiple axes
我正在嘗試優化算法以減少內存使用量,並且我已經將此特定操作確定為一個痛點。
我有一個對稱矩陣,沿着行的索引數組,以及沿着列的另一個索引數組(這只是我沒有在行索引中選擇的所有值)。 我覺得我應該能夠同時傳入兩個索引,但我發現自己被迫沿着一個軸選擇然后另一個軸,這導致一些內存問題,因為我實際上並不需要副本返回的數組,只是我正在計算的統計數據。 這是我想要做的:
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
轉換為列矩陣(例如inliers.reshape(-1,1)
或inliers[:, np.newaxis]
,因此它具有形狀(m,1))和索引mat
與第一列中的內容:
s1 = mat[inliers.reshape(-1,1), outliers]
scores = s1.min(axis=0)
在可讀性方面有更好的方法:
result = mat[np.ix_(inliers, outliers)].min(0)
https://docs.scipy.org/doc/numpy/reference/generated/numpy.ix_.html#numpy.ix_
嘗試:
outliers = np.array(outliers) # just to be sure they are arrays
result = mat[inliers[:, np.newaxis], outliers[np.newaxis, :]].min(0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.