簡體   English   中英

花式索引沿多個軸的numpy數組的最佳實踐

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM