Mam tablicę dowolnej długości i chcę wybrać n Elementy, równomiernie rozstawione (w przybliżeniu, ponieważ N może być nawet, długość tablicy może być pierwsza, itp.), Który zawiera pierwszy element {x0}} i Element ostatniego arr[len-1].

Przykład:

>>> arr = np.arange(17)
>>> arr
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16])

Wtedy chcę, aby funkcja była następująca, aby Grab {X0}} równomiernie rozłożona w tablicy, która musi zawierać pierwszy i ostatni element:

GetSpacedElements(numElems = 4)
>>> returns 0, 5, 11, 16

Czy to ma sens?

Próbowałem arr[0:len:numElems] (za pomocą tablicy start:stop:skip notation) i niewielkie odmiany, ale nie dostaję tego, czego szukam tutaj:

>>> arr[0:len:numElems]
array([ 0,  4,  8, 12, 16])

Lub

>>> arr[0:len:numElems+1]
array([ 0,  5, 10, 15])

Nie obchodzi mnie dokładnie, co są średnimi pierwiastkami, o ile są rozmieszczone równomiernie rozstawione przez indeks 1 Powiedzmy. Ale uzyskanie odpowiedniej liczby elementów, w tym wraz zero i ostatnie indeks, są krytyczne.

Mam nadzieję, że ktoś może mi pomóc znaleźć szybką liniową, dzięki!

15
JDS 4 czerwiec 2018, 19:55

3 odpowiedzi

Najlepsza odpowiedź

Aby uzyskać listę równomiernie rozmieszczonych wskaźników, użyj np.linspace:

idx = np.round(np.linspace(0, len(arr) - 1, numElems)).astype(int)

Następnie indeksu powrót do arr, aby uzyskać odpowiednie wartości:

arr[idx]

Zawsze używaj zaokrąglania przed odlewaniem do liczb całkowitych. Wewnętrznie, linspace połączenia astype, gdy zapewniony jest argument DTPE. Dlatego ta metoda jest nie równoważna:

# this simply truncates the non-integer part
idx = np.linspace(0, len(array) - 1, numElems).astype(int)
idx = np.linspace(0, len(arr) - 1, numElems, dtype='int')
18
ddelange 4 czerwiec 2018, 18:23

Jeśli chcesz dowiedzieć się więcej o znalezieniu indeksów, które pasują do wartości, których szukasz, również spójrz na numpy.argmin i numpy.where. Wdrażanie pierwszego:

import numpy as np

test = np.arange(17)

def nearest_index(array, value):
    return (np.abs(np.asarray(array) - value)).argmin()

def evenly_spaced_indices(array, steps):
    return [nearest_index(array, value) for value in np.linspace(np.min(array), np.max(array), steps)]

print(evenly_spaced_indices(test,4))

Należy pamiętać, że jest to niepotrzebna ilość funkcji wzywa do początkowego pytania, o którym prosiłeś jako switfly wykazany przez ColdSpeed. np.round Intuicyjnie okrążają do najbliższego dopasowanego całkowitego służenia jako indeks, wdrażający podobny proces, ale zoptymalizowany w C ++. Jeśli jesteś zainteresowany indeksy też, możesz mieć swoją funkcję, po prostu powrócimy:

import numpy as np

def GetSpacedElements(array, numElems=4, returnIndices=False):
    indices = np.round(np.linspace(0, len(arr) - 1, numElems)).astype(int)
    values = array[indices]
    return (values, indices) if returnIndices else (values)

arr = np.arange(17) + 42
print(arr)
print(GetSpacedElements(arr, 4))                            # values only
print(GetSpacedElements(arr, 4, returnIndices=True)[0])     # values only
print(GetSpacedElements(arr, 4, returnIndices=True)[1])     # indices only
1
ddelange 5 czerwiec 2018, 12:08

Twoja funkcja GetSpaceDelements () powinna również podjąć w tablicy, aby uniknąć niefortunnych działań niepożądanych w innym miejscu w kodzie. Mówi się, że funkcja musiałaby tak wyglądać:

import numpy as np

def GetSpacedElements(array, numElems = 4):
    out = array[np.round(np.linspace(0, len(array)-1, numElems)).astype(int)]
    return out

arr = np.arange(17)
print(array)
spacedArray = GetSpacedElements(arr, 4)
print (spacedArray)
2
Justin 4 czerwiec 2018, 17:18