Oto co mam aktualnie robi, to działa, ale jest to trochę uciążliwe:Jak uzyskać najwyższy element w wartości bezwzględnej w macierzy numpy?
x = np.matrix([[1, 1], [2, -3]])
xmax = x.flat[abs(x).argmax()]
Oto co mam aktualnie robi, to działa, ale jest to trochę uciążliwe:Jak uzyskać najwyższy element w wartości bezwzględnej w macierzy numpy?
x = np.matrix([[1, 1], [2, -3]])
xmax = x.flat[abs(x).argmax()]
Jedyne co mogę myśleć, co wygląda jeszcze gorzej, to:
xmax=x[np.unravel_index(abs(x).argmax(), x.shape)]
EDYTOWANIE: Moja odpowiedź jest nie na temat, przepraszam. Jak zauważył Ophion, to zwróci indeks, a nie wartość - musisz użyć flat
z moim "xmax
" (co jest naprawdę "xmaxInd
"), aby uzyskać właściwą wartość. Ergo Myślę, że twoje rozwiązanie jest najlepsze.
Po eksperymentach trochę zdałem sobie sprawę, można po prostu to zrobić:
x = np.matrix([[1,1], [2,-3]])
absX = abs(x)
xmax = argmax(absX)
Wydaje się, że numpy pozwala wziąć abs
jak również argmax
matrycy. Jak wygodnie!
timeit
sprawdza:
def meth1():
x = np.matrix([[1,1],[2,-3]])
xmax = x.flat[abs(x).argmax()]
def meth2():
x = np.matrix([[1,1],[2,-3]])
xmax = argmax(abs(x))
t1 = timeit.Timer("meth1()","from __main__ import meth1")
t2 = timeit.Timer("meth2()","from __main__ import meth2")
mean(t1.repeat(1,100000))
daje Out[99]: 7.854323148727417
mean(t2.repeat(1,100000))
daje Out[98]: 7.7788529396057129
Więc meth2()
jest nieco szybciej. Prawdopodobnie dlatego, że nie wymaga wywoływania flat
.
To zwraca 3, nie -3, nie tak naprawdę pytanie zadaje. – Daniel
@Ophion to dobry punkt, byłem zdezorientowany przez wskaźniki. Myślę, że musisz wtedy użyć 'flat'. –
Myślę, że jest to dość prosty sposób, który może być nieco lepszy, jeśli najważniejsza jest czytelność kodu. Ale tak naprawdę, twoja droga jest równie elegancka.
np.min(x) if np.max(abs(x)) == abs(np.min(x)) else np.max(x)
szukałem sposobu, aby uzyskać podpisane wartości maksymalnych wartościach bezwzględnych tablicy n-wymiarowej wzdłuż określonej osi, która obsługiwać żadna z tych odpowiedzi. Tak więc przygotowałem funkcję, aby to zrobić. Nie obiecuje, ale to działa w miarę Przetestowałem go:
def maxabs(a, axis=None):
"""Return slice of a, keeping only those values that are furthest away
from 0 along axis"""
maxa = a.max(axis=axis)
mina = a.min(axis=axis)
p = abs(maxa) > abs(mina) # bool, or indices where +ve values win
n = abs(mina) > abs(maxa) # bool, or indices where -ve values win
if axis == None:
if p: return maxa
else: return mina
shape = list(a.shape)
shape.pop(axis)
out = np.zeros(shape, dtype=a.dtype)
out[p] = maxa[p]
out[n] = mina[n]
return out
Dobra odpowiedź !! Zmienilbym p = abs (maxa) **> ** abs (mina) na p = abs (maxa) **> = ** abs (mina) – idoo
Wartość szukasz musi być x.max()
lub x.min()
więc można zrobić
max(x.min(), x.max(), key=abs)
który jest podobny do rozwiązania aestrivex, ale być może bardziej czytelne? Należy zauważyć, że zwróci to minimum w przypadku, gdy x.min()
i x.max()
mają taką samą wartość bezwzględną, np. -5
i 5
. Jeśli masz preferencję, po prostu zamów wejścia na odpowiednio max
.
Ten oblicza bezwzględne maksimum szybko - respektując dowolny argument axis
w taki sam sposób jak robią to np.max
i np.argmax
.
def absmaxND(a, axis=None):
amax = a.max(axis)
amin = a.min(axis)
return np.where(-amin > amax, amin, amax)
przypadku długich tablic jego około 2,5x szybciej niż a.flat[abs(a).argmax()]
nawet dla prostego przypadku axis=None
- ponieważ nie czynią abs() oryginalnego wielkim tablicy.
Wygląda całkiem elegancko dla mnie ...? Czy mieszkanie jest wolne? Bo szczerze to wygląda naprawdę ładnie. –